我有服务器客户端应用程序。 当我连续发送消息时(下面的代码中没有 scanf),服务器似乎没有收到它们(不打印)。 如果我稍等一下(使用下面代码中的 scanf),然后发送下一条消息,服务器工作正常并打印所有消息。
有什么问题吗? 我该如何修复它,因为我想对到达服务器的消息执行更多操作(而不仅仅是打印它)。
在我的客户端代码中(服务器不打印任何内容)
char message[(100)] = {0};
int x = rand();
while(i < 3)
{
printf(" I send %d\n", x);fflush(NULL);
sprintf(message, "%d",x);
if( send(mainSockfd, message,strlen(message),0) == -1)
{
printf("ERRRRRORRRR\n");fflush(NULL);
}
i++;
x = rand() % 100;
}
在我的客户端代码中(当服务器打印消息时)
char message[(100)] = {0};
int x = rand();
while(i < 3)
{
printf(" I send %d\n", x);fflush(NULL);
sprintf(message, "%d",x);
if( send(mainSockfd, message,strlen(message),0) == -1)
{
printf("ERRRRRORRRR\n");fflush(NULL);
}
i++;
x = rand() % 100;
scanf("%d",&x); // this is the only change
}
在我的服务器代码中
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;
}
}
最佳答案
由于您似乎正在传输以 0
结尾的“字符串”,而没有 0
终止,因此您应该读取比读取少一个 char
buffer 提供的读取缓冲区始终以 0
结尾,就像您尝试 printf
一个您引发的非 0
结尾的“字符串”一样未定义的行为。
所以改变这个
readLength = recv(sockfd, command, 100+1,0);
变成这样
readLength = recv(sockfd, command, 100,0);
关于客户端消息未通过 tcp Winsock 到达服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25487081/