Клиент C не получает от сервера

#c #sockets #select

#c #розетки #выбирать

Вопрос:

Я создал простую клиентскую серверную программу, select() но проблема в том, что клиент не получает приветственное сообщение. Я делал это несколько раз раньше без select() , и это сработало, но вдруг оно не хочет работать при работе с select() . Что я делаю не так?

Сервер:

 #define MAX_CLIENTS 10  int main() {  system("clear");  printf("***SERVER STARTED***n");   int master_socket = socket(AF_INET, SOCK_STREAM, 0);  fd_set fdsForReading;   struct sockaddr_in address;  address.sin_family = AF_INET;  address.sin_addr.s_addr = INADDR_ANY;  address.sin_port = htons(8888);  bind(master_socket, (struct sockaddr *)amp;address, sizeof(address));  listen(master_socket, 3);   while (1)  {  FD_ZERO(amp;fdsForReading); // Clearing the file descriptor set  FD_SET(master_socket, amp;fdsForReading); // Add master_socket to file descriptor set   printf("Monitoring for connections...n");  select(master_socket   1, amp;fdsForReading, NULL, NULL, NULL);   int accepted_socket = accept(master_socket, (struct sockaddr *)amp;address, sizeof(address));  printf("[ ] New connection acceptedn");   char buffer[125] = "Welcome to my server";  send(accepted_socket, buffer, sizeof(buffer), 0);   printf("End of while loopn");  } }  

Клиент:

 int main() {  system("clear");  int clientSocket = socket(AF_INET, SOCK_STREAM, 0), x;   struct sockaddr_in serverAddress;  serverAddress.sin_family = AF_INET;  serverAddress.sin_port = htons(8888);  serverAddress.sin_addr.s_addr = INADDR_ANY;   connect(clientSocket, (struct sockaddr *)amp;serverAddress, sizeof(serverAddress));   char serverResponse[125];  recv(clientSocket, amp;serverResponse, sizeof(serverResponse), 0);  printf("test: %sn", serverResponse);   scanf("%d", amp;x);   close(clientSocket); }  

Ответ №1:

  • Вы не проверяете наличие ошибок. Всегда так делаю!
  • amp;serverResponse должно быть serverResponse
  • recv может быть получено меньше символов, чем вы отправили, поэтому вам следует проверить, сколько символов вы получили, и, возможно, объединить полученные данные, пока вы не получите полное сообщение.
  • То, что вы получаете, обычно не завершается нулем, поэтому вам нужно добавить , если то, что вы получаете, должно использоваться с подобными функциями printf("%s", ... , для которых требуются строки с нулевым завершением. В вашем случае вы действительно отправляете 125 char s, даже если строка намного короче. Вероятно, вам не следует этого делать. Это приведет к отправке строки нулевого завершающего символа:
     send(accepted_socket, buffer, strlen(buffer)   1, 0);  
  • Третьим аргументом accept должно быть socklen_t * — нет sizeof(address) . Пример:
     socklen_t addrlen = sizeof address; int accepted_socket = accept(master_socket, (struct sockaddr *)amp;address, amp;addrlen);  

С учетом этих изменений клиент получит штраф за приветствие, если ошибок не произойдет, но когда вы добавите проверку ошибок, вы увидите, в чем проблема в этом случае.

Комментарии:

1. @хасан Рад, что это помогло! Не за что!