#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. @хасан Рад, что это помогло! Не за что!