C ++非阻塞TCP服务器无法发送比其收到的字节数更多的消息

时间:2017-09-07 07:42:17

标签: tcp network-programming winsock tcpserver

我对网络编程很陌生。我使用winsock2编写了一个简单的非阻塞TCP服务器,但它表现得很奇怪,以至于我在之前提出的问题中找不到它的任何例子。

我的服务器只能发送一个包含之前收到的字节数的消息。例如,如果之前它收到了" rec_msg",当我尝试发送" message_to_send"它只发送" message"。

我不知道它是否有任何影响,但服务器是用纯静态类封装的。以下是通过接收和发送消息的功能:

int TCPServer_Test::receiveMessage(){
    while(1)
    {   
  memset(recvbuf, 0, DEFAULT_BUFLEN);
  iResult = recv(ClientSocket, recvbuf, recvbuflen, 0);
  int err = WSAGetLastError();
  int counter = 0;
  if (iResult > 0) 
  {
            std::cout << "Mesaj Alindi: " << recvbuf << std::endl;
            break;
  }
    else if(err == WSAEWOULDBLOCK)
  {
            Sleep(200);
            continue;
    }
  else if (iResult == 0){
    printf("Connection closing...\n");
      return -1;
    }
  else  
  {
    printf("recv failed with error: %d\n", WSAGetLastError());
    closesocket(ClientSocket);
    WSACleanup();
    assert(false);
  }
    }
}
void TCPServer_Test::sendMessage(char* Source){
    strncpy(recvbuf, Source, DEFAULT_BUFLEN);

  iSendResult = send( ClientSocket, recvbuf, iResult, 0);

    if (iSendResult == SOCKET_ERROR) {
        printf("send failed with error: %d\n", WSAGetLastError());
        closesocket(ClientSocket);
        WSACleanup();
    assert(false);
    } 
    else if (iSendResult == 0) {
        printf("send failed with error: %d\n", WSAGetLastError());
        closesocket(ClientSocket);
        WSACleanup();
    assert(false);
    }
    else
    {
        printf("Bytes sent: %d\n", iSendResult);
    }
    memset(recvbuf, 0, sizeof(recvbuf));
}

我将非常感谢任何直接相关的帮助。

1 个答案:

答案 0 :(得分:4)

看起来好像是因为您正在使用iResult变量,该变量包含在发送数据时收到的上一次recv调用期间收到的数据量,而不是像这样提供要发送的数据的实际大小: / p>

size_t bytes_count_to_be_send = strlen(Source);
iSendResult = send( ClientSocket, Source, bytes_count_to_be_send, 0);

另请注意,没有必要将数据复制到缓冲区中。