C++,socket编程,server端接收的数据不完整,中间参杂十六进制的CDCDCDCD,请问是怎么回事?
intreadLen=0;SOCKETsockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&SOCKADDRLen);char*...
int readLen = 0;
SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient, &SOCKADDRLen);
char *p = (char *)buffer; //rawDataBuffer是unsigned int型
int sendLen = 0;
for(int i=0; i<16; i++)
{
sendLen += send(sockClient,p,4000,0);
p = p+4000;
}
---------------------------------------------------------------------------------------
connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
char *p = (char*)rawDataBuffer; //rawDataBuffer是unsigned int型
for(int i=0; i<16; i++)
{
readLen += recv(sockConn, p, 4000, 0);
p = p + 4000;
}
closesocket(sockConn);
第一行的readLen的定义应该放在虚线下面的代码中,粘贴时出错了。。。
第一段是发送数据的client,第二段是接收数据的server,调试发现sendLen是正确的,readLen不正确,比sendLen小 展开
SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient, &SOCKADDRLen);
char *p = (char *)buffer; //rawDataBuffer是unsigned int型
int sendLen = 0;
for(int i=0; i<16; i++)
{
sendLen += send(sockClient,p,4000,0);
p = p+4000;
}
---------------------------------------------------------------------------------------
connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
char *p = (char*)rawDataBuffer; //rawDataBuffer是unsigned int型
for(int i=0; i<16; i++)
{
readLen += recv(sockConn, p, 4000, 0);
p = p + 4000;
}
closesocket(sockConn);
第一行的readLen的定义应该放在虚线下面的代码中,粘贴时出错了。。。
第一段是发送数据的client,第二段是接收数据的server,调试发现sendLen是正确的,readLen不正确,比sendLen小 展开
2个回答
展开全部
第一个问题,有 0xcdcdcdcd 是因为 buffer 里面 4000 个字节部分没有初始化,例如,buffer只有前面3个字节被赋值了,但后面的字节没有去理,后面的就是没初始化的字节,就是0xcd
第二个问题,要理解recv函数的工作流程,它是有数据就读,虽然你设置了4000的大小,但假如当时只接收到3600个字节,它也会返回,因此readLen就是3600,不是4000。而后面那句 p = p + 4000; 也应该改成 p = p + readLen;
要想得到你预期的效果应该把server那里改成
char *p = (char*)rawDataBuffer; //rawDataBuffer是unsigned int型
int n = 0;
while(n < 16 * 4000)
{
readLen += recv(sockConn, p, 4000, 0);
p = p + readLen;
}
closesocket(sockConn);
这样才能接收到完整的数据
第二个问题,要理解recv函数的工作流程,它是有数据就读,虽然你设置了4000的大小,但假如当时只接收到3600个字节,它也会返回,因此readLen就是3600,不是4000。而后面那句 p = p + 4000; 也应该改成 p = p + readLen;
要想得到你预期的效果应该把server那里改成
char *p = (char*)rawDataBuffer; //rawDataBuffer是unsigned int型
int n = 0;
while(n < 16 * 4000)
{
readLen += recv(sockConn, p, 4000, 0);
p = p + readLen;
}
closesocket(sockConn);
这样才能接收到完整的数据
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询