我创建了一个socket,采用SOCK_STREAM,我需要发送多个数据,所以在发送端,就连着写了几个发送函数,比如说我发了一个A,一个b,但是在接收端怎么会接收到Ab呢,而且有的时候是这样,有的时候接收正确,一个A,一个b。

解决方案 »

  1.   

    發了一個後,等待n(ms)後再發另一個
      

  2.   

    晕,接收端为什么如此不稳定呢?
    我在发送端发了三个John,15和6,接收端第一次接收到John,烫烫6
    第二次接收正确,第三四次都接收正确,为什么阿?
      

  3.   

    发了一个A,一个b,但是在接收端怎么会接收到Ab呢,而且有的时候是这样,有的时候接收正确,一个A,一个b。
    发送的时候,可能是一次发送多次接收,也可能是多次发送的一次就接收了
    要自己程序来处理了
      

  4.   

    TO:flyingjm((我要找工作)) 
    是不是一次发送多次接收,就会出现“烫烫“的情况,
    多次发送一次接收,就是出现把两个数据一起接收了?
    自己的程序要怎样处理呢?
      

  5.   

    但是还有这样的情况:我在发送端发了三个John,15和6,接收端接收到John,烫烫6
    15丢了
      

  6.   

    还有个问题:我有多个send函数,所以我另外写了一个函数专门发送数据,
    函数原型是void TransferValue(int sockid,int  m_iTypeNumber,int m_iElementNumber,char* buffer)
    {
      send(...)
    }
    void main()
    {
    char buffer[1024];TransferValue(
    TransferValue(
    ......
    }
    为什么接收到的字符串最多是四位,多于四位的都截取了,我的缓冲区是1024呀,为什么?
    如果不用TransferValue,都写在main中,就没有这个问题。
      

  7.   

    各位大虾:出现烫烫6的情况越来越多了!5555555555555555(我在发送端发了三个John,15和6,接收端接收到John,烫烫6
    15丢了)
      

  8.   

    首选你要检查一下你的接收缓冲区有没有清空,用memset()清为零,看是否还烫
    第二如果你在发送端发了多次,那么你在接收端可以采用多次接收,每次接收想要的固定的长度,当然也可以一次读出,比如你发了3次,每次2个字节,那么你可以一次读出来6个字节的长度,关于这个问题我也不太明白,但实验结果确是如此,还听其他高手来讲一下
      

  9.   

    我的发送端代码:
           if((send(sockid,BER,sizeof(BER),0))<0)
    {
    perror("there is error in sending the data");
    return -1;
    }
    else
    {
    printf("Sending successfully.\n");
    }
                
    itoa(SET,m_str,10);
    if((send(sockid,m_str,sizeof(m_str),0))<0)
    {
    perror("there is error in sending the data\n");
    //return -1;
    }
    else
    printf("-->%s\n",m_str);
     ...................后面还有很多类似的
    接收端代码:
    do{

       msgsocket=accept(socketid,(struct sockaddr*)&server_addr,&length);
    if(msgsocket==INVALID_SOCKET)
    {
    perror("there is error in open new socket");
    break;
    }
    else do
    {

    memset(buffer,0,sizeof(buffer));
    rval=recv(msgsocket,buffer,BUFFERLENGTH,0);
    if(rval<0)
    {
    perror("there is error in recving");
    break;
    }
    if(rval==0)
    {
    printf("ending connection....");
                      // closesocket(socketid);
                                //WSACleanup();
                           break;
    // return 0;
    }
    else     
    {
    printf("-->%s\n",buffer);

    }
    }while(rval!=0);

    closesocket(msgsocket);
    }while(TRUE);
      

  10.   

    建议使用ACE好多底层的问题不用想的
      

  11.   

    很正常的,这个跟你的网络情况有关,发送多个连续的数据包之间的时间间隔,还有数据包的大小有关,
    TCP会自动组包和拆包的,所以你的程序要有拆包处理功能,你的协议一定要定义好!