Я использую сокеты Berkeley (оба: домен Интернета и домен Unix), и мне было интересно, могут ли сервер использовать те же сокеты для чтения запроса и для написания ответа клиенту. Или клиент должен создать другой сокет, чтобы дождаться повтора и сервер подключиться к нему после обработки полученного сообщения.
Кстати, я говорю о сокетов, ориентированных на соединение (потоковые сокеты, TCP,...).
Это упрощенный код сервера (я просто пропустил проверку ошибок на системных вызовах только для простоты):
int main() {
int server_socket, connected_socket;
struct sockaddr_in server_addr;
char buf[1024];
char aux[256];
int bytes_read;
server_socket = socket(AF_INET, SOCK_STREAM, 0);
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = INADDR_ANY;
server_addr.sin_port = htons(1234);
bind(server_socket, &server_addr, sizeof(server_addr))
listen(server_socket, 5)
connected_sodket = accept(server_socket, 0, 0);
do {
bzero(buf, sizeof(buf));
bytes_read = read(connected_socket, buf, sizeof(buf));
} while (bytes_read > 0);
/* Here I want to use connected_socket to write the reply, can I? */
close(connected_socket);
close(server_socket);
return (EXIT_SUCCESS);
}
И это упрощенный клиентский код (здесь я просто обманываю проверку ошибок на системных вызовах):
int main() {
int client_socket;
struct sockaddr_in server_addr;
client_socket = socket(AF_INET, SOCK_STREAM, 0);
hp = gethostbyname("myhost");
server_addr.sin_family = AF_INET;
memcpy(&server_addr.sin_addr, hp->h_addr_list[0], hp->h_length);
server_addr.sin_port = htons(1234);
connect(client_socket, &server_addr, sizeof(server_addr));
write(client_socket, MSG, sizeof(MSG));
/* Here I want to wait for a response from the server using client_socket, can I? */
close(client_socket);
return (EXIT_SUCCESS);
}
Могу ли я использовать connected_socket
на сервере и client_socket
в клиенте для передачи ответного сообщения? Или я должен использовать адрес клиента, который я получаю на сервере, когда "принимать" для подключения к сокету на клиенте?
Я попытался использовать read/wrint в клиенте/сервере, где отображается комментарий, но таким образом обе программы блокируются, кажется, что это блокировка.
Спасибо, вперед! С наилучшими пожеланиями.