客户端消息未通过 tcp Winsock 到达服务器

标签 c windows tcp client-server winsock

我有服务器客户端应用程序。 当我连续发送消息时(下面的代码中没有 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/

相关文章:

c# - tcp 服务器在第一次循环后失败

c# - 无法通过 TCP 连接连接到 Android

C 编译器和循环优化

c - return以变量结尾时是什么意思?

c++ - 我可以为特定功能显式取消定义宏吗?

java - 通过 CMD 与 Powershell 执行 Java 命令时的差异 - 由句点 ("."引起)

html - 在不导航到该网页的情况下访问网页的框架文档

c - 我们如何编写一个程序,可以让我们输入任意数量的字符串?

c - 为结构变量赋值

java - 如何模拟套接字断开连接?