求助:采用TCP发送数据,发送的数据不能全部接收

AOAO 2013-01-03 02:09:21
本人小白,采用winsock写的一个tcp方式的发送程序,我在一个for循环里发送数据,每次发送1445个字符,接收端采用for循环,但是有时候接收到的不足1445个字符,求大家给提供一下解决办法,或者给分析一下原因。
发送端:

SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);

SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=inet_addr( pThis->m_strName);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(pThis->m_port+10);//端口号

connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
//下面发送数据主要代码
char sendBuf2[MAX_BUF];//MAX_BUF=1445
ZeroMemory(sendBuf2,MAX_BUF);
for(int i=0;(i+0)<900;i+=1)
{
//sendContent = "";
k=0;
sendBuf2[k++] = '1';
// if(i== 4)
// sendBuf2[k++] = 'Q';
// else
sendBuf2[k++] = 'P';

sendBuf2[k++] = (char)(i/256-128);
sendBuf2[k++] = (char)(i%256-128);
sendBuf2[k++] = (char)1;
int j;
//int k=5;

for( j=0;j<nWidth;j++)
{

sendBuf2[k++] = 'a';//(char)(pThis->pD1->Img_ori[i][j]-128); //memcpy
}
t3=GetTickCount();
int len=send(sockClient,sendBuf2,1445,0);

}

接收端:
 char recvBuf2[MAX_BUF];
for(int i=0;i<900;i++)
{
ZeroMemory(recvBuf2,MAX_BUF);
int len1;
len1=recv(sockConn,recvBuf2,MAX_BUF,0);
}


上面的len1有时候是小于1445的数,不能全部接收,是不是缓冲区的大小设置不够合理?
...全文
207 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
dibotiger 2013-01-09
  • 打赏
  • 举报
回复
两个建议: 1.发送和接收端应该在开始数据交换前, 两房应该都知道数据的大小. 2.接受端在接收完数据后, 应该发送一个确认数据包, 发送端要接收这个确认数据包来获取交换的结果.
hurryboylqs 2013-01-03
  • 打赏
  • 举报
回复
int len=send(sockClient,sendBuf2,1445,0); ====>> int len=TCPsend(sockClient,sendBuf2,1445,0); len1=recv(sockConn,recvBuf2,MAX_BUF,0); ===>> len1=TCPrecv(sockConn,recvBuf2,MAX_BUF,0);
hurryboylqs 2013-01-03
  • 打赏
  • 举报
回复
把你的send函数和recv函数替换成下面的函数即可:

int TCPsend(SOCKET s,const char*buf,int len,int flags)
{
    int n=0,sendCount=0;
    int length =len;
    if(buf==NULL)
        return 0;
    while(length>0)
    {
        n=send(s,buf+sendCount,length,flags); //发送数据,
        if(n==SOCKET_ERROR)//网络出现异常
        {
            printf("Failed send(),error code:%d\n",WSAGetLastError());
            break;
             
        }
        length-=n;
        sendCount+=n; 
    }
 
    return sendCount; // 返回已发送的字节数
}
 
int TCPrecv(SOCKET s,char *buf,int len,int flags)
{
     
    int nRev=0,recvCount=0;
    int length =len;
 
    if(buf==NULL)
        return 0;
 
    // 循环接收数据
    while(length>0)
    {
        nRev =recv(s,buf+recvCount,length,flags);
        if(nRev==SOCKET_ERROR)//网络出现异常
        {
            printf("Failed recv(),error code:%d\n",WSAGetLastError());
            break;
        }
        length-=nRev;
        recvCount+=nRev;
    }
 
    return recvCount; //返回接收到的字节数
}
AOAO 2013-01-03
  • 打赏
  • 举报
回复
引用 1 楼 hurryboylqs 的回复:
循环接收循环发送不是这么做的,发送send的时候要检测返回值,recv的时候也要判断返回值决定是否再次recv ,TCP是流式的,发送一次可能要recv两次,发送两次也可能一次recv就接收完毕了
请大神给个详细点的解释,搞了好几天了都。 您说的检测返回值是检测发送/接收到的数据大小吗?如果大小不对,该怎么不能啊 大神今年发大财!!!
hurryboylqs 2013-01-03
  • 打赏
  • 举报
回复
循环接收循环发送不是这么做的,发送send的时候要检测返回值,recv的时候也要判断返回值决定是否再次recv ,TCP是流式的,发送一次可能要recv两次,发送两次也可能一次recv就接收完毕了

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧