저는 네트워크 프로그래밍에 익숙하지 않습니다. 나는 winsock2를 사용하여 간단한 비 블로킹 TCP 서버를 작성했지만, 이상한 방식으로 동작하여 이전에 묻는 질문에서 그 예제를 찾을 수 없었다.C++ 비 블로킹 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));
}
내가 어떤 도움 직접 관련 여부를 감사하겠습니다. 또한
size_t bytes_count_to_be_send = strlen(Source);
iSendResult = send(ClientSocket, Source, bytes_count_to_be_send, 0);
:이 같은 전송 될 데이터를 전송하는 대신 데이터의 실제 크기를 제공 할 때 이전 recv
통화 중 수신 된 데이터의 양을 포함 iResult
변수를 사용하고 있기 때문에 그런 일이 같은
또한 수신 코드는 수신 된 데이터가 null로 끝났다고 가정되지만 보장되지는 않습니다. 그것은'recv'의 반환 값을 사용하여'std :: cout'에 얼마나 많은 양의 데이터가 기록되는지를 제한해야합니다. –
@RemyLebeau'recv' 코드에 대한 또 다른 의심스러운 점은 버퍼 크기가 먼저 DEFAULT_BUFLEN으로 표현되지만 그 다음으로 'recvbuflen'. – VTT
@RemyLebeau 실제 코드에서 널 종료의 가정은 없으며, 그 cout은 단순화를 얻으려는 시도이지만 대체로 대단히 감사합니다. –