免费注册 查看新帖 |

Chinaunix

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

[函数] 请问linux下几个关于tcp的recv接收函数的问题 [复制链接]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
1 [报告]
发表于 2004-06-23 17:07 |显示全部楼层

请问linux下几个关于tcp的recv接收函数的问题

1,recv( MSG_PEEK ); (不过建议你采用“一次读一个字节的方法”)。
2,getsockopt( SO_RCVBUF );

注:参考 man。
附:我自己写的 ReadUntil
  1. int JServiceThread::ReadUntil( SOCKET sock, char *buffer, int size, char *flag, int seconds )
  2. {
  3.     int readBytes = 0;
  4.     int ret, flagSize;

  5.     flagSize = (int)strlen(flag);

  6.         ret = WaitForRead( sock, seconds );
  7.         if ( ret == SOCKET_ERROR )
  8.                 return SOCKET_ERROR;

  9.     ret = recv( sock, buffer, flagSize, 0 );
  10.     if ( ret != flagSize )
  11.         return SOCKET_ERROR;

  12.         readBytes += ret;
  13.     if ( memcmp( buffer, flag, flagSize ) == 0 )
  14.         {
  15.                 memset( buffer, 0x00, flagSize );
  16.         return 0;                // 接收到哨兵
  17.         }

  18.     while( readBytes < size )
  19.     {
  20.                 ret = WaitForRead( sock, seconds );
  21.                 if ( ret == SOCKET_ERROR )
  22.                         break;

  23.         ret = recv( sock, buffer + readBytes, 1, 0 );
  24.         if ( ret == SOCKET_ERROR )
  25.             break;
  26.         else
  27.             readBytes ++;

  28.         if ( memcmp( buffer+readBytes-flagSize, flag, flagSize ) == 0 )   // 接收到哨兵
  29.                 {
  30.                         memset( buffer+readBytes-flagSize, 0x00, flagSize );
  31.                         readBytes -= flagSize;
  32.             break;
  33.                 }
  34.     }

  35.     return readBytes;
  36. }
复制代码

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
2 [报告]
发表于 2004-06-23 17:18 |显示全部楼层

请问linux下几个关于tcp的recv接收函数的问题

WaitForRead 是 select 的封装。有关 select 的用法,
请 man select。

flag 是一个指定的记号,比如 flag = '\n',那么这个函数就会一直接收数据,直到接收到 '\n' 为止。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
3 [报告]
发表于 2004-06-23 18:00 |显示全部楼层

请问linux下几个关于tcp的recv接收函数的问题

你的水平太差,建议先不要搞通讯。
学学编个九九乘法表,可能更加对你有好处。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
4 [报告]
发表于 2004-06-23 18:12 |显示全部楼层

请问linux下几个关于tcp的recv接收函数的问题

你连 strlen 是什么意思你都不知道,水平还不差啊?
其实不知道 strlen 是什么不要紧,关键是你连“如何去知道”的方法都不掌握,真是菜到极点了。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
5 [报告]
发表于 2004-06-23 18:19 |显示全部楼层

请问linux下几个关于tcp的recv接收函数的问题

我的 flag 允许是多个字符,
你没看见我用 char * 吗?
strlen( char * ) 有什么不可以了?

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
6 [报告]
发表于 2004-06-23 18:29 |显示全部楼层

请问linux下几个关于tcp的recv接收函数的问题

大哥,你自己用点心好不好?

好像我帮了你反而象犯了错一样。
早知道就不回了。
就当我没说。

BTW:没人说过让我一定把你教会的,反正我是这么做的,爱听不听!

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
7 [报告]
发表于 2004-06-23 18:49 |显示全部楼层

请问linux下几个关于tcp的recv接收函数的问题

[quote]原帖由 "linux_newbie"]因为ret返回的字节数可能大于0,但是小于flagsize,[/quote 发表:

我本来自己写了一个函数叫 readn 的,可以确保读取到的数据长度为欲期的长度。
但是程序发上来的时候我把它替换成 recv 了,主要是不想引入太多的自定义函数。

如果这一句不出问题,那么下面的两个 bug 也就不存在了,对吧?

现已更正。谢谢提出错误!

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
8 [报告]
发表于 2004-06-23 18:54 |显示全部楼层

请问linux下几个关于tcp的recv接收函数的问题

[quote]原帖由 "ablelocal"]能不能把你传递前获得*char的函数放上来看看?[/quote 发表:

你丫下次不要再说“你丫”了好不好?

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
9 [报告]
发表于 2004-06-23 19:03 |显示全部楼层

请问linux下几个关于tcp的recv接收函数的问题

原帖由 "ablelocal" 发表:

把你传递前获得*char的函数放上来看看?

strcpy( flag, "\n" );

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
10 [报告]
发表于 2004-06-23 21:26 |显示全部楼层

请问linux下几个关于tcp的recv接收函数的问题

原帖由 "linux_newbie" 发表:
原来如此。。

不过说句实话,如果找个\n结尾的,每次都recv一个字节,效率嘛。。。。呵呵

效率?
那么,怎样才能更高一些?
愿闻高见!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP