我对网络编程很陌生。我使用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));
}
我将非常感谢任何直接相关的帮助。
答案 0 :(得分:4)
看起来好像是因为您正在使用iResult
变量,该变量包含在发送数据时收到的上一次recv
调用期间收到的数据量,而不是像这样提供要发送的数据的实际大小: / p>
size_t bytes_count_to_be_send = strlen(Source);
iSendResult = send( ClientSocket, Source, bytes_count_to_be_send, 0);
另请注意,没有必要将数据复制到缓冲区中。