客户端消息不';t在tcp winsock中到达服务器
我有一个服务器客户端应用程序。 当我连续发送消息(下面的代码中没有scanf)时,服务器似乎没有收到它们(没有打印)。 如果我稍等一下(下面的代码中有scanf),然后发送下一条消息,服务器工作正常并打印所有消息 有什么问题吗? 我如何修复它,因为我想对到达服务器的消息做更多的处理(不仅仅是打印) 在我的客户机代码中(服务器不打印任何内容)客户端消息不';t在tcp winsock中到达服务器,c,windows,tcp,client-server,winsock,C,Windows,Tcp,Client Server,Winsock,我有一个服务器客户端应用程序。 当我连续发送消息(下面的代码中没有scanf)时,服务器似乎没有收到它们(没有打印)。 如果我稍等一下(下面的代码中有scanf),然后发送下一条消息,服务器工作正常并打印所有消息 有什么问题吗? 我如何修复它,因为我想对到达服务器的消息做更多的处理(不仅仅是打印) 在我的客户机代码中(服务器不打印任何内容) char消息[(100)]={0}; int x=rand(); 而(i
char消息[(100)]={0};
int x=rand();
而(i<3)
{
printf(“我发送%d\n”,x);fflush(NULL);
sprintf(消息,“%d”,x);
如果(发送(mainSockfd,消息,strlen(消息),0)=-1)
{
printf(“errrrrrr\n”);fflush(NULL);
}
i++;
x=rand()%100;
}
在我的客户端代码中(当服务器打印消息时)
char消息[(100)]={0};
int x=rand();
而(i<3)
{
printf(“我发送%d\n”,x);fflush(NULL);
sprintf(消息,“%d”,x);
如果(发送(mainSockfd,消息,strlen(消息),0)=-1)
{
printf(“errrrrrr\n”);fflush(NULL);
}
i++;
x=rand()%100;
scanf(“%d”,&x);//这是唯一的更改
}
在我的服务器代码中
char command[(100+1)] = {0};
while(1)
{
readLength = recv(sockfd, command, 100+1,0);
if(readLength > 0)
{
printf("arrived = %s,\n",command);fflush(NULL);
ZeroMemory(command, sizeof(command));
}
else if( readLength == 0)
{
break;
}
else if ( readLength < 0 ){
if(GetLastError() == 10035)
{
continue;
}
if(GetLastError() == 10057 || GetLastError() == 10054)
{
break;
}
continue;
}
}
char命令[(100+1)]={0};
而(1)
{
readLength=recv(sockfd,命令,100+1,0);
如果(读取长度>0)
{
printf(“到达=%s\n”,命令);fflush(NULL);
零内存(命令,sizeof(命令));
}
else if(readLength==0)
{
打破
}
else if(readLength<0){
如果(GetLastError()==10035)
{
继续;
}
如果(GetLastError()==10057 | | GetLastError()==10054)
{
打破
}
继续;
}
}
当您似乎正在传输0
终止的“字符串”而不终止0
时,您应该读取一个char
,少于读取缓冲区提供的读取缓冲区,以便始终终止0
,就好像您试图printf
一个非0
终止的“字符串”你挑起了未定义的行为
所以改变这个
readLength = recv(sockfd, command, 100+1,0);
变成这样
readLength = recv(sockfd, command, 100,0);
命令如何声明?什么是MAX_MSGLEN
?同时打印readLength
。message
是如何声明的?我编辑过。连接关闭时,readLength为-1。在没有scanf的代码中,什么也不打印(我也尝试打印readLength)。“readLength为-1”,您通过GetLastError()
?10054.得到了哪个错误。。当客户端完成发送消息并关闭连接时,就会发生这种情况。如果recv()
返回0
,则可以中断循环,因为这意味着另一方关闭了连接。请看这里:是的,这是一部经典之作。网络代码#0193473:)中strlen()的滥用现在我得到第一条消息ok,另外两条消息连接在一起。我发4167和34。第一条消息是“Arrized=41”,第二条消息是“Arrized=6734”,第三条消息是“Arrized=,”@KobiGuetta:好的,这是一个不同的问题。你可能想提出另一个问题。另外,阅读此答案可能有助于您了解正在发生的情况。如果我使用Winsock函数(如WSArecv)或可能使用事件(FDSET等),这很重要吗?我从未尝试过使用它们。@alk:我在发送函数中更改了,从strlen(message)改为100,现在它从未连接,打印效果很好,但有时它什么都不打印(readLength为-1)。
readLength = recv(sockfd, command, 100+1,0);
readLength = recv(sockfd, command, 100,0);