Я использую сокеты Беркли (оба: интернет-домен и домен 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 на клиенте / сервере, где отображается комментарий, но таким образом обе программы остаются заблокированными, похоже, это тупик.
Спасибо заранее!
Привет.