关于send函数在发送的数据长度大于发送缓冲区大小,或者大于发送缓冲区剩余大小时,socket会怎么反应。参见这篇博客的两种说法http://blog.csdn.net/gukesdo/article/details/7295592
自己做了个测试,服务器只起socket在侦听,不recv, 也不send.
//ubuntu10.04 32bit
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
int main(void)
{
int fd;
struct sockaddr_in addr;
fd = socket(AF_INET, SOCK_STREAM, 0);
addr.sin_family = AF_INET;
addr.sin_port = htons(103);
addr.sin_addr.s_addr = htonl(INADDR_ANY);
bind(fd, (struct sockaddr *)&addr, sizeof(addr));
listen(fd,5);
}
客户端,将发送缓冲区大小设置成2k,然后一次发送3k的数据。
//ubuntu10.04 32bit
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <arpa/inet.h>
int main()
{
int fd,ret,tmp,sendlen;
struct sockaddr_in addr;
char *buf;
int sendBufLen = 1024*2;
socklen_t optlen = sizeof(int);
buf = (char *)malloc(1024 * 3);
fd = socket(AF_INET, SOCK_STREAM,0 );
setsockopt(fd,SOL_SOCKET, SO_SNDBUF,(const char*)&sendBufLen, sizeof(int));
getsockopt(fd,SOL_SOCKET, SO_SNDBUF,(int *)&tmp, &optlen);
printf("send_tmp=%d,optlen=%d\n",tmp,(int)optlen); //设置发送缓冲区2048
getsockopt(fd,SOL_SOCKET, SO_RCVBUF,(int *)&tmp, &optlen);
printf("recv_tmp=%d,optlen=%d\n",tmp,(int)optlen);
addr.sin_family = AF_INET;
addr.sin_port = htons(103);
addr.sin_addr.s_addr = inet_addr("222.111.112.204"); //填上自己的IP
ret = connect (fd, (struct sockaddr *)&addr, sizeof(addr));
printf("connect return %d\n",ret);
getchar();
if (ret >= 0)
sendlen = send(fd,buf,102

当使用send函数发送的数据长度超过socket发送缓冲区大小时,系统会自动分次发送。在Windows和Linux上,无论是阻塞还是非阻塞模式,send都会将大数据分帧进行传输。例如,发送3K数据到缓冲区大小为2K的socket,在不同系统中表现为分三次发送,每次发送的字节数接近缓冲区大小。
1048

被折叠的 条评论
为什么被折叠?



