关于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,1024*3,0);
printf("sendlen=%d\n"