套接字
写服务器之前我们要知道服务器和终端是怎样通讯的,套接字接口是一组函数,由操作系统实现,通过它可以实现服务器与客户端的通信。
一个套接字地址的数据结构是(定义在netinet/in.h)
1 | struct sockaddr_in//internet套接字地址 |
在系统提供的套接字接口中,参数是通用的套接字地址结构sockaddr(定义在socket.h),需要强制转换
1 | struct sockaddr |
socket函数
函数原型:int socket(int domain,int type,int protocol)
;
函数返回一个套接字描述符,也就是一个文件描述符fd=socket(AF_INET,SOCK_STREAM,0)``AF_INET
表示因特网,SOCK_STREAM
表示这个套接字是因特网连接的一个端点
connect函数
客户端通过调用connect
函数来与服务器建立连接
函数原型int connect(int sockfd,struct sockaddr* serv_addr,int addrlen)
sockfd
是一个套接字描述符,serv_addr
是要连接的服务器地址,addrlen
是sizeof(addrlen)
该函数成功返回0,失败返回-1,成功后客户端就可以读写sockfd了
bind函数
函数原型:int bind(int sockfd,struct sockaddr* my_addr,int addrlen);
作用是将my_addr
表示的服务器套接字地址和sockfd
绑定
成功返回0,出错返回-1
listen函数
函数原型:int listen(int sockfd,int backlog);
作用是将sockfd转换成一个监听套接字,客户端会对监听套接字发起请求,成功返回0,失败返回-1,backlog
是等待队列的长度
accept函数
函数原型int accept (int listenfd,struct sockaddr *addr,int *addrlen);
该函数等待来自客户端的连接到达监听描述符listenfd
,然后将客户端的套接字地址写入addr
,成功返回一个已连接描述符,服务器通过读写已连接描述符和客户端通信,失败则返回-1
通过上面这些函数我们可以整合出两个函数,一个再服务器指定端口打开监听描述符,一个在客户端对指定地址和端口发起连接
open_listenfd函数
函数原型int open_listenfd(int prot);
成功返回一个在port
端口打开的监听描述符,失败返回-1
open_clientfd函数
函数原型int open_clientfd(char *hostname,int port);
对域名hostname
的port
端口发起连接,成功返回一个描述符,失败返回-1
上面两个函数的实现
1 |
|
测试
写了两个小demo来进行测试
客户端
1 |
|
服务端
1 |
|