免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4565 | 回复: 10
打印 上一主题 下一主题

UDP套接字设置选项后怎么无法recvfrom? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-03-16 14:10 |只看该作者 |倒序浏览
本帖最后由 okocha-jay 于 2010-03-17 17:25 编辑

代码在后面;
查过低水位,1字节;


我是想验证一下,如果UDP服务器设置的接收缓冲区只有8字节,
而客户发来10字节,看看收到了什么,有没什么错误;

但是在服务器bing之前调用了setsockopt,就算客户端发数据,
服务进程还是阻塞在recvfrom。

用#if 0 取消那段设置代码,才能收到数据。

请问大家是什么原因?(本机的默认接收缓冲区好像有110KB)

论坛徽章:
0
2 [报告]
发表于 2010-03-16 14:24 |只看该作者
你的意思是通过setsockopt设置成了8字节,就收不到数据了?这是正确的啊,因为客户发送10字节,而缓冲区只有8字节,协议栈会把它丢掉的

论坛徽章:
0
3 [报告]
发表于 2010-03-16 16:22 |只看该作者
本帖最后由 okocha-jay 于 2010-03-17 17:20 编辑

回复 2# rain_fish


    谢谢你的答复;
我设置为18字节,也是收不到10字节的数据,阻塞在recvfrom
也查过接受缓冲区的低水位,是1字节

论坛徽章:
0
4 [报告]
发表于 2010-03-16 17:45 |只看该作者
那说明你写的程序有问题

论坛徽章:
1
黑曼巴
日期:2020-02-27 22:54:26
5 [报告]
发表于 2010-03-17 09:30 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
6 [报告]
发表于 2010-03-17 11:25 |只看该作者
本帖最后由 cjog 于 2010-03-17 14:31 编辑

看下你的SO_RCVLOWAT选项

论坛徽章:
0
7 [报告]
发表于 2010-03-17 11:38 |只看该作者
回复 1# okocha-jay


    应该是你的代码问题,跟你设置的buff没有关系的,不可能buff少了,就出现你的情况,你设置buff太小了,内核不会搭理你的,会自动设成它的默认值的.

论坛徽章:
0
8 [报告]
发表于 2010-03-17 17:25 |只看该作者
本帖最后由 okocha-jay 于 2010-03-17 17:33 编辑
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <strings.h>
  5. #include <unistd.h>
  6. #include <sys/socket.h>
  7. #include <netdb.h>

  8. int main(int argc, char *argv[]) {

  9.   int sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
  10.   struct sockaddr_in serv;
  11.   bzero(&serv, sizeof(serv));
  12.   serv.sin_family = AF_INET;
  13.   serv.sin_addr.s_addr = htonl(INADDR_ANY);
  14.   serv.sin_port =  htons(8888);

  15.   if( bind(sock, (struct sockaddr *)&serv, sizeof(serv) ) )
  16.   {
  17.           perror("bind failure:");
  18.           exit(0);
  19.   }
  20.   
  21.   int size = 18;
  22.   socklen_t len = sizeof(int);

  23.   char recvbuf[32] = {0};
  24.   
  25. #if 1
  26.   if ( setsockopt(sock,SOL_SOCKET, SO_RCVBUF, &size, len))
  27.          perror("error\n");
  28.   printf("recvs= %.2f\n", size*1.0);
  29.   if ( setsockopt(sock,SOL_SOCKET, SO_SNDBUF, &size, len))
  30.          perror("error\n");
  31.   printf("send = %.2f\n", size*1.0);
  32.   if ( getsockopt(sock,SOL_SOCKET, SO_RCVLOWAT, &size, &len))
  33.          perror("error\n");
  34.   printf("low recv = %.2f\n", size*1.0);
  35. #endif
  36.   struct sockaddr_in client;
  37.   bzero(&client, sizeof(client));
  38.   len = sizeof(client);
  39.   int ret = recvfrom(sock, recvbuf, 32,0, (struct sockaddr *)&client, &len );
  40.   printf("received = %d\n", ret);
  41.   printf("from %s\n", inet_ntoa(client.sin_addr));
  42.   int i;
  43.   for (i=0; i< ret; ++i)
  44.           printf("%c", recvbuf[i]);
  45.   printf("!!!!\n");

  46.   close(sock);
  47.   exit(0);
  48. }
复制代码

论坛徽章:
0
9 [报告]
发表于 2010-03-18 11:34 |只看该作者
int ret = recvfrom(sock, recvbuf, 32,0, (struct sockaddr *)&client, &len );

              sendto(*,sendbuff,32,0,*,*);
你发送也是32个吗?发送函数呢?

论坛徽章:
0
10 [报告]
发表于 2010-03-18 11:49 |只看该作者
回复 9# 独臂剑客
发送了10字节。recvfrom的32只是说,收的包不要超过32字节吧

另一个帖子,解决了这个问题,但不明白为什么。发送1字节数据,服务端的缓冲区也必须是402字节
    http://bbs.chinaunix.net/thread-1678411-1-2.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP