Socket

   套接字接口适用于任意的底层协议,一般是基于TCP/IP。

Socket

                                                                                  套接字接口

socket函数
      客户端和服务器使用Socket函数来创建一个套接字描述符:
      int socket(int domain, int type, int protocol),若成功则返回非负描述符,否则-1。
一般这样调用:clientfd = Socket(AF_INET, SOCK_STREAM, 0), 其中AF_INET表明正在使用因特网,SOCK_STREAM表示套接字是因特网连接的端点,socket返回的clientfd仅是部分打开,并且不能用于读写。

connect函数
      int connect(int socketfd, struct sockaddr * serv_addr, int addlen),成功返回0,否则返回-1。
      Connect函数试图与地址为serv_addr的服务器建立一个因特网连接,addlen是sizeof(socketaddr_in).Connect函数会阻塞,一直到连接成功建立或发生错误,如果成功,sockfd现在就准备好读写了,得到的连接是由套接字对:(x:y, serv_addr.sin_addr:serv_addr.sin_port)刻画的,x表示客户端的ip,y表示临时端口。


bind函数
      int bind(int sockfd, struct sockaddr * my_addr, int addrlen)。若成功返回0,出错则返回-1。
      bind函数告诉内核将my_addr中的服务器套接字地址和套接字描述符sockfd联系起来,参数addrlen就是sizeof(sockaddr_in)。


listen函数

      客户端是发起连接请求的主动实体,服务器是等待来自客户端的连接请求的被动实体,默认情况下,内核会认为socket函数创建的描述符对应于主动套接字,它存在于一个连接的客户端。服务器调用listen函数告诉内核,描述符是被服务器而不是客户端使用的。
      int listen(int sockfd, int backlog),成功返回0,否则返回-1。
      listen函数将sockfd从一个主动套接字转化为一个监听套接字,该套接字可以接受来自客户端的连接请求。backlog参数暗示内核在开始拒绝连接请求之前,应该放入队列中的未完成连接请求的数量。

 

accept函数
      int accept(int listenfd, struct sockaddr * addr, int * addrlen),成功返回非负描述符,出错则为-1。
      accept函数等待来自客户端的连接请求到达监听符listenfd,然后在addr中填写客户端的套接字地址,并返回一个已连接描述符,这个描述符可被用来利用Unix I/O函数与客户端通信。

 

监听描述符和已连接描述符
    之所以区分这两种描述符,是因为它使得我们可以建立并发服务器。例如:每当一个连接请求到达监听描述符时,我们可以派生(fork)一个新的进程,通过它的已连接描述符与客户端通信。
Socket