#include<sys/socket.h>
(1)请求建立连接——套接字与服务器连接。
(1.1)
如果该套接字类型是SOCK_STREAM,则connect函数用于向服务器发出连接请求,服务器的IP地址和端口号由serv_addr指定;
如果该套接字类型是SOCK_DGRAM,则connect并不建立真正的连接,只是告诉内核与该套接字通讯的目的地址(由第二个参数指定),只有该目的地址发来的数据才会被该socket接收。对于SOCK_DGRAM类型的套接字,connect的好处是不必每次发送和接收数据时都指定目的地址。
(1.2)
对于面向连接(如TCP)的套接字,其只能调用一次connect函数。
对于无连接(如UDP)的套接字,可以多次 调用connect以改变目的地址的绑定。将参数serv_addr中的sa_family设置为AF_UNSPEC即可。
bind和connect的参数相似。
serv_addr提供了sock_fd将绑定的本地地址,可以将serv_addr的sin_addr设置为INADDR_ANY而不是某个确定的IP就可以绑定到任何网络接口。对于只有一个IP地址的计算机,INADDR_ANY就是该机的IP地址。对于有多块网卡的计算机,INADDR_ANY表示本服务器程序将处理来自所有网络接口上相应端口的连接请求。
(3)将socket建立的是主动套接字
(4)接受连接,可以接收的状态。只能对面向连接的套接字使用accept函数。 套接字接受客户端连接请求
int accpet(int sock_fd, struct sockaddr *addr, socklen_t *addrlen)
接受连接后,系统写入addr客户端的地址和端口等信息,接受连接前是没有的。
(5)TCP套接字的数据传输
(5.1)send:send负责将buf中的数据复制到发送缓冲区。复制完成就返回。
(5.2)recv:recv将s的接收缓冲区数据复制到buf中,len为buf的长度。
第一步:等待直到套接字发送缓冲区的数据发送完毕;
第二步:等待直到套接字接收缓冲区有数据并且接收完毕,开始从接收缓冲区复制数据到buf中;
第三步:复制完毕,返回值。