免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-06-23 16:35 |只看该作者 |倒序浏览
1。需要接收数个数据包,不等长,有没有函数或者方法在recv之前就就对套接口的缓存进行分析从而找到数据包之间的中止符?
2。一般套接口的缓存区有多大?

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
2 [报告]
发表于 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
3 [报告]
发表于 2004-06-23 17:18 |只看该作者

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

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

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

论坛徽章:
0
4 [报告]
发表于 2004-06-23 17:47 |只看该作者

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

do
        {
        len = recv(temp_sock_descriptor,buff,sizeof(buff),0);
        if (len == -1)       
                {
                        perror("call to recv";
                        exit(1);
                }
                 decode(buff); //我这里要对数据进行分析
                 //memset(buff,0,1024);
        }while(len == 0);
我的意思是在recv之前,有没有可能说找到数据包的中止符,这样,我就可以根据sizeof来为recv定位
我看你的代码,似乎你这句flagSize = (int)strlen(flag); 就是这个意思,但是我不明白这句代码为什么可以进入到套接字的缓存里面去找flag?

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
5 [报告]
发表于 2004-06-23 18:00 |只看该作者

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

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

论坛徽章:
0
6 [报告]
发表于 2004-06-23 18:06 |只看该作者

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

从哪里看出我水平太差了?
char *flag;  //flag 是一个指定的记号,比如 flag = '\n'
然后直接strlen(flag)
真的是看不明白了。。。。
不搞不行啊,不搞没人发工资我

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
7 [报告]
发表于 2004-06-23 18:12 |只看该作者

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

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

论坛徽章:
0
8 [报告]
发表于 2004-06-23 18:15 |只看该作者

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

strlen是找到一个字符串的长度
按照你的解释,你是strlen(‘\n’),那我就非常不明白了

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
9 [报告]
发表于 2004-06-23 18:19 |只看该作者

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

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

论坛徽章:
0
10 [报告]
发表于 2004-06-23 18:21 |只看该作者

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

原帖由 "flw" 发表:
WaitForRead 是 select 的封装。有关 select 的用法,
请 man select。

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


这是阁下写的吧

言规正传,你的flag从哪边得去获得呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP