tcp - C++ 非阻塞 TCP 服务器无法发送比接收到的字节多的消息

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

如果有任何直接相关或无关的帮助,我将不胜感激。

最佳答案

这看起来是因为您使用的是 iResult 变量,该变量包含在发送数据而不是向其提供数据的实际大小时在先前的 recv 调用期间接收到的数据量像这样发送:

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

另请注意,实际上并不需要将数据复制到缓冲区中。

关于tcp - C++ 非阻塞 TCP 服务器无法发送比接收到的字节多的消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46090684/

相关文章:

通过 wlan 的 TCP 套接字

c - 在屏幕底部保持提示消息应用程序

multithreading - 在 TCP 客户端服务器中循环读取和写入数据时的并发问题

c++ - 通过 TCP 套接字发送文件 C++ | window

javascript - 在网络浏览器中实现一个好的 redis 客户端需要什么?

c# - 防止客户端在基本网络服务器中连接两次

c - 如何从 WSAGetLastError() 检索错误字符串?

android - 通过WinSock2 Api的 "recv()"函数调用单次调用获取全部接收字节

c# - 使用 TCP 时,我是否需要使用校验和来保护我的消息?

ios - BSD 套接字在 iPhone 3G 环境中不起作用