客户端消息不会在tcp winsock中到达服务器

时间:2014-08-25 13:31:51

标签: 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;
        }
    }

1 个答案:

答案 0 :(得分:1)

当你似乎在没有0终止的情况下转移0 - 已终止的“字符串”时,你应该读取一个char少于读取缓冲区提供的值,以便始终具有读取缓冲区0 - 已终止,就像您尝试printf0 - 已终止的“字符串”一样,您会引发未定义的行为。

所以改变这个

readLength = recv(sockfd, command, 100+1,0);

成为这个

readLength = recv(sockfd, command, 100,0);