gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 02:56:37 26 4
gpt4 key购买 nike

我是网络编程的新手。我已经使用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com