端接收数据。该函数的第一个参数指定接收端套接字描述符;第二个参数指明一个缓冲区,该缓冲区用来存放recv函数接收到的数据;第三个参数指明buf的长度;第四个参数一般置0。这里只描述同步Socket的recv函数的执行流程。当应用程序调用recv函数时,recv先等待s的发送缓冲中的数据被协议传送完毕,如果协议在传送s的发送缓冲中的数据时出现网络错误,那么recv函数返回SOCKET_ERROR,如果s的发送缓冲中没有数据或者数据被协议成功发送完毕后,recv先检查套接字s的接收缓冲区,如果s接收缓冲区中没有数据或者协议正在接收数据,那么recv就一直等待,只到协议把数据接收完毕。当协议把数据接收完毕,recv函数就把s的接收缓冲中的数据copy到buf中(注意协议接收到的数据可能大于buf的长度,所以在这种情况下要调用几次recv函数才能把s的接收缓冲中的数据copy完。函数仅仅是copyrecv数据,真正的接收数据是协议来完成的),recv函数返回其实际copy的字节数。如果recv在copy时出错,那么它返回SOCKET_ERROR;如果recv函数在等待协议接收数据时网络中断了,那么它返回0。注意:在U
ix系统下,如果recv函数在等待协议接收数据时网络断开了,那么调用recv的进程会接收到一个SIGPIPE信号,进程对该信号的默认处理是进程终止。7、bi
d函数i
tbi
dSOCKETsco
ststructsockaddrFAR
amei
t
amele
当创建了一个Socket以后,套接字数据结构中有一个默认的IP地址和默认的端口号。一个服务程序必须调用bi
d函数来给其绑定一个IP地址和一个特定的端口号。客户程序一般不必调用bi
d函数来为其Socket绑定IP地址和断口号。该函数的第一个参数指定待绑定的Socket描述符;第二个参数指定一个sockaddr结构,该结构是这样定义的:structsockaddru_shortsa_familycharsa_data14sa_family指定地址族,对于TCPIP协议族的套接字,给其置AF_INET。当对TCPIP协议族的套接字进行绑定时,我们通常使用另一个地址结构:structsockaddr_i
shortsi
_familyu_shortsi
_portstructi
_addrsi
_addrcharsi
_zero8
f其中si
_family置AF_INET;si
_port指明端口号;si
_addr结构体中只有一个唯一的字段s_addr,表示IP地址,该字段是一个整数,一般用函数i
et_addr()把字符串形式的IP地址转换成u
sig
edlo
g型的整数值后再置给s_addr。有的服务器是多宿主机,至少有两个网卡,那么运行在这样的服务器上的服务程序在为其Socket绑定IP地址时可以把hto
lINADDR_ANY置给s_addr,这样做的好处是不论哪个网段上的客户程序都能与该服务程序r