Answer the question
In order to leave comments, you need to log in
Why does recv not return an error when interrupting the server (Ctrl + C)?
I use Windows Sockets 2.
Server code:
...
void inputMessage(char* buffer, int size)
{
printf("Enter message: ");
fgets(buffer, size, stdin);
buffer[strlen(buffer) - 1] = '\0'; // удалить '\n'
}
int sendMessage(SOCKET ConnectedSocket)
{
char buffer[MESSAGE_MAXLEN + 1]; // + 1 для '\n'
int error = 0;
inputMessage(buffer, MESSAGE_MAXLEN + 1); // здесь нажмём Ctrl + C
if (send(ConnectedSocket, buffer, strlen(buffer) + 1, 0) == SOCKET_ERROR)
{
error = WSAGetLastError();
printf("send failed: %d\n", error);
}
return error;
}
...
...
int receiveMessage(SOCKET ClientSocket)
{
char buffer[MESSAGE_MAXLEN];
int error = 0;
puts("Waiting server response...");
if (recv(ClientSocket, buffer, MESSAGE_MAXLEN, 0) != SOCKET_ERROR)
{
// recv не возвращает ошибку
printf("server response: %s\n", buffer); // напечатает кракозябры
}
else
{
error = WSAGetLastError();
printf("recv failed: %d\n", error);
}
return error;
}
...
Answer the question
In order to leave comments, you need to log in
Maybe the servet socket is closed normally and recv returns 0. From man recv :
In general, you are very famously printing the result from a buffer filled with recv: there is no guarantee that exactly as much will be received as sent by send, and the terminating character with code 0 may not be in the buffer. It would be better to do something like this:
ssize_t recvd = recv(ClientSocket, buffer, MESSAGE_MAXLEN, 0);
if (recvd != SOCKET_ERROR)
{
// recv не возвращает ошибку
printf("server response: %.*s\n", recvd, buffer); // напечатает только то, что было принято
}
else
{
error = WSAGetLastError();
printf("recv failed: %d\n", error);
}
Didn't find what you were looking for?
Ask your questionAsk a Question
731 491 924 answers to any question