读书人

recv函数接收返回值的有关问题感觉有

发布时间: 2013-08-04 18:26:16 作者: rapoo

recv函数接收返回值的问题,感觉有点奇怪
不是说recv是接受的的确切数据大小吗?

 ret=recv(sock, buf, strlen(head)-4, 0);
printf("%s\n",buf);
printf("recv buf:%d\n",strlen(buf));
printf("recv ret:%d\n",ret);

为什么我用了这几行代码后结果输出的两个数字不一样?buf开始时清空了的。。。
既然recv接收到的数据都放在buf里,那两个数值应该相等啊。结果ret等于我放送的字节数,strlen(buf)小于ret,这是什么情况 socket recv?
[解决办法]
引用:
Quote: 引用:


可以理解的,
recv函数的里面长度,是希望接收到数据的长度大小,
而返回值是实际上接收到的数据大小,
在网路过程中,也是有可能接收到垃圾数据的!

就算接收到垃圾数据不是也应该放到buf里面去吗?那我的buf长度也应该等于实际接收到的数据大小啊


刚写一个demo测试了你说的情况,是不可能的!
服务端:

len = send ( client_sock, "welcometotheserverAAA", 50, 0);

printf(" had send datelen = %d\n", len);
printf(" want send datelen = 50 \n");


客户端
 char buf[50] = {0};
55 int len;
56 if( (len = recv( client_sock, buf, 10 , 0)) < 0 )
57 {
58 perror("recv");
59 Ret = -3;
60 goto ERROR;


61 }
62
63 printf(" had recv datelen = %d\n", len);
64 printf(" want recv datelen = 10\n");
65 printf(" want recv date: %s\n", buf);



运行结果:

This is a server
had send datelen = 50
want send datelen = 50
This is a client
had recv datelen = 10
want recv datelen = 10
want recv date: welcometot



你的那种情况不对!因为服务端那实际发的数据大小你是不知道的!
所以,recv会给你大小,让内核来处理最大只能接收这么多的数据的!
比这个少,只能说服务端发的实际数据比要求的少了

读书人网 >C++

热点推荐