A
A
Alex Serov2016-10-30 02:23:34
C++ / C#
Alex Serov, 2016-10-30 02:23:34

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;
}
...


Client code:

...
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

1 answer(s)
J
jcmvbkbc, 2016-10-30
@gibsonman01

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 question

Ask a Question

731 491 924 answers to any question