【问题标题】:client messages don't arrive to server in tcp winsock客户端消息未在 tcp winsock 中到达服务器
【发布时间】:2014-10-18 16:08:41
【问题描述】:

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

【问题讨论】:

  • command 是如何声明的? MAX_MSGLEN 是什么?同时打印readLengthmessage 是如何声明的?
  • 我编辑了。当连接关闭时,readLength 为 -1。在没有 scanf 的代码中没有打印任何内容(我也尝试打印 readLength)。
  • "readLength is -1" 以及GetLastError() 得到的错误是什么?
  • 10054.. 当客户端发送完他的消息并关闭连接时会发生这种情况
  • 如果recv() 已返回0,则可以中断循环,因为这意味着另一个关闭了连接。请在此处阅读:msdn.microsoft.com/en-us/library/windows/desktop/…

标签: c windows tcp client-server winsock


【解决方案1】:

由于您似乎正在传输0-终止的“字符串”而没有0 终止,您应该读取一个char,然后读取缓冲区提供的读取缓冲区始终为0-终止,就好像你尝试 printf 一个非 0 终止的“字符串”,你会引发未定义的行为。

所以改变这个

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

变成这样

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

【讨论】:

  • 是的 - 这是一个经典。在网络代码中滥用 strlen() #0193473 :)
  • 现在我收到了第一条消息,其他两条连接在一起。我正在发送 41 67 和 34。第一条消息是“arrived = 41”,第二条消息是“arrived = 6734”,第三条消息是“arrived = ”
  • @KobiGuetta:好的,这是一个不同的问题。您可能想提出另一个问题。还阅读此答案stackoverflow.com/a/24536689/694576 可能会帮助您了解正在发生的事情。
  • 重要的是我使用的是 WSArecv 等 Winsock 函数还是使用事件(FDSET 等)?我从未尝试过使用它们。
  • @alk:我已将发送函数从 strlen(message) 更改为 100,现在它从未连接过并且打印正常,但有时它什么都不打印(readLength 为 -1)。
猜你喜欢
  • 2018-03-03
  • 2014-09-08
  • 2012-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-07
  • 2013-04-29
  • 1970-01-01
相关资源
最近更新 更多