您的位置:程序门 -> vc/mfc -> 网络编程



recv函数怎么设置接收缓冲区的长度


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


recv函数怎么设置接收缓冲区的长度[已结贴,结贴人:qingfeng_happy2]
发表于:2008-02-19 20:06:02 楼主
采用阻塞多线程的方法开发基于tcp/ip的程序,数据的协议已经规定好了,数据每隔60秒发送一次。具体格式大致如下:

24h     数据长度字节     54h     数据1     。。。。。。数据n       效验和

具体解释如下:

24h:为1字节数据头

数据长度字节:为数据长度字节后面的所有数据长度。

54h:为指令

数据n:
      ...

校验和:
      ...

我现在的疑问是:

1     在用recv函数接收数据时,要设定缓冲区的大小,可是在我接收之前是没办法知道这组数据共有多少个字节的,那我怎么设置缓冲区的大小?针对我这个程序,是不是应该保证缓冲区长度刚好等于这组数据的长度?怎么保证?

2     tcp传输的是字节流,对方每隔60秒发送一组数据过来,我怎么调用recv函数才能将对方发送来的一组数据全部接收,不多不少?

请各位看客不吝赐教,不胜感激。
发表于:2008-02-19 20:16:341楼 得分:10
你多收几次知道确定是一个完成的包即可
不用管系统缓冲区有多长
发表于:2008-02-19 20:34:462楼 得分:0


//你多收几次知道确定是一个完成的包即可  
//不用管系统缓冲区有多长

//////////////////

//那就是说缓冲区长度可以随便定义,比如char   buffer[100];然后
bool   myrecv(...)
{
char   buffer[100];
int   nmax=100;  
while(nmax   >   0)
{
      int   nlen   =   recv(sock,buffer,nmax,0   );
      if   (nlen   <   0)
            return   false;
      nmax   -=   nlen;
}
return   ture;
}
但是这样子我怎么知道什么时候一个完整的包已经接收到了呢?该怎么操作?
发表于:2008-02-19 20:51:383楼 得分:0
你应该还要指定一个接受缓冲的结束标记.不然,容易出现阻塞现象
发表于:2008-02-19 21:48:024楼 得分:0
bool       myrecv(...)  
{  
char       buffer[100];  
int       nmax=100;      
while(nmax       >       0)  
{  
            int       nlen       =       recv(sock,buffer,nmax,0       );  
            if       (nlen       <       0)  
                        return       false;  
            nmax       -=       nlen;  
}  
return       ture;  
}  

在上面这个函数中,指定了recv函数往接收缓冲区拷贝100个字节的数据。我有如下困惑:

如果socket的接收缓冲区中有200个字节的数据,而recv函数每次拷贝的字节数是不确定的,如果第一次拷贝80个字节,那第二次拷贝是不是只能少于或等于20字节,直到凑够100字节为止?
发表于:2008-02-19 21:50:175楼 得分:40
通过缓冲区大小无法确保一个消息已经完整接收,发送方和接受方必须通过某种协议通知对方发送消息的长度。例如,可以把报文长度先伐过去。
发表于:2008-02-19 21:51:406楼 得分:0
所以你要做的是先接收数据长度(这个一般是个int,宽度固定),然后根据长度来接收后续的
发表于:2008-02-19 22:17:107楼 得分:0
有点明白了。我的协议中的前两个字节第一个字节24h代表包头,第二个字节就代表数据长度,只是我怎么才能将前两个字节提取出来,然后将第二个字节的大小设为接收缓冲区的长度呢?
发表于:2008-02-19 22:45:288楼 得分:0
收两个字节怎么还不会?recv(hsocket,buffer,2,0)不就可以?
发表于:2008-02-19 23:01:189楼 得分:0
我想这样做,各位看看行不行:
先接收两个字节:

bool   myrecv(...)    
{  
int   ntwo=recv(hsocket,buffer,2,0);

unsigned   int   ntemp=atoi(buffer[1]);     //将第二个字节也就是长度字节转化为无符号整形
int   nbufmax=ntohl(ntemp);     //网络字节序转化为主机字节序

char   buf[nbufmax];     //将nbufmax设置为接收缓冲区大小

while(nbufmax>   0)      
{      
          int   nlen     =   recv(sock,buf,nbufmax,0);      
          if   (nlen     <   0)      
                return       false;
     
          nmax       -=     nlen;      
}      
return     ture;  
}
发表于:2008-02-19 23:35:2610楼 得分:0
atoi是这样用的?人家是接收一个字符串,而不是一个字符
发表于:2008-02-20 10:40:4511楼 得分:0
  int       nbufmax=ntohl(buffer[1]);      
改成上面这样可以了吗?    


快速检索

最新资讯
热门点击