const char FAR *buf,
int len,
int flags
);
不论是客户还是服务器应用程序都用 send 函数来向 TCP 连接的另一端发送数据。客户程序
一般用 send 函数向服务器发送请求,而服务器则通常用 send 函数来向客户程序发送应答。
该函数的第一个参数指定发送端套接字描述符;第二个参数指明一个存放应用程序要发送数
据的缓冲区;第三个参数指明实际要发送的数据的字节数;第四个参数一般置 0。这里只描
述同步 Socket 的 send 函数的执行流程。当调用该函数时,send 先比较待发送数据的长度 l
en 和套接字 s 的发送缓冲区的长度,如果 len 大于 s 的发送缓冲区的长度,该函数返回 SO
CKET_ERROR;如果 len 小于或者等于 s 的发送缓冲区的长度,那么 send 先检查协议是否正
在发送 s 的发送缓冲中的数据,如果是就等待协议把数据发送完,如果协议还没有开始发送
s 的发送缓冲中的数据或者 s 的发送缓冲中没有数据,那么 send 就比较 s 的发送缓冲区的
剩余空间和 len,如果 len 大于剩余空间大小 send 就一直等待协议把 s 的发送缓冲中的数
据发送完,如果 len 小于剩余空间大小 send 就仅仅把 buf 中的数据 copy 到剩余空间里(注
意并不是 send 把 s 的发送缓冲中的数据传到连接的另一端的,而是协议传的,send 仅仅是
把 buf 中的数据 copy 到 s 的发送缓冲区的剩余空间里)。如果 send 函数 copy 数据成功,
就返回实际 copy 的字节数,如果 send 在 copy 数据时出现错误,那么 send 就返回 SOCKET_
ERROR;如果 send 在等待协议传送数据时网络断开的话,那么 send 函数也返回 SOCKET_ERR
OR。要注意 send 函数把 buf 中的数据成功 copy 到 s 的发送缓冲的剩余空间里后它就返回了,
但是此时这些数据并不一定马上被传到连接的另一端。如果协议在后续的传送过程中出现网
络错误的话,那么下一个 Socket 函数就会返回 SOCKET_ERROR。(每一个除 send 外的 Sock
et 函数在执行的最开始总要先等待套接字的发送缓冲中的数据被协议传送完毕才能继续,
如果在等待时出现网络错误,那么该 Socket 函数就返回 SOCKET_ERROR)
注意:在 Unix 系统下,如果 send 在等待协议传送数据时网络断开的话,调用 send 的进程
会接收到一个 SIGPIPE 信号,进程对该信号的默认处理是进程终止。
六、recv 函数
int recv(
SOCKET s,
评论15