Страницы

Поиск по вопросам

четверг, 16 мая 2019 г.

C Socket: Долго сбрасывается соединение

есть такой код:
int read_s, str_size; char recive_msg[TEXTSIZE_BUFER]; struct sockaddr_in server, client;
str_size = sizeof(struct sockaddr_in); server.sin_port = htons(100); server.sin_addr.s_addr = INADDR_ANY; server.sin_family = AF_INET;
for (;;) { int socket_r = socket(AF_INET, SOCK_STREAM, 0), clnt_r;
setsockopt(socket_r, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout, sizeof(timeout)); setsockopt(socket_r, SOL_SOCKET, SO_SNDTIMEO, (char *)&timeout, sizeof(timeout)); printf("22
");
memset(server.sin_zero, '\0', sizeof(server.sin_zero)); if (bind(socket_r, (struct sockaddr *)&server, sizeof(server)) < 0) goto close_socket;
printf("aa
");
listen(socket_r, 10); if ((clnt_r = accept(socket_r, (struct sockaddr *)&client, &str_size)) <= 0) goto close_socket;
read_s = recv(clnt_r, recive_msg, TEXTSIZE_BUFER, 0); printf("close
>%s
", recive_msg);
close_socket: setsockopt(socket_r, SOL_SOCKET, SO_REUSEADDR, &(int){1}, sizeof(int)); setsockopt(clnt_r, SOL_SOCKET, SO_REUSEADDR, &(int){1}, sizeof(int)); close(clnt_r); close(socket_r); }
Проблема: Когда софт выполняет SO_REUSEADDR и close(), возвращается в начале и потом секунд 20-30 циклится на printf("22
");, только после этого идет дальше. Вопрос такой: в чем может быть причина?
Изначально у меня задумка была поделить клиент и сервер часть в 2 отдельных потока...и когда освобождается порт выполняется тот или иной поток.


Ответ

SO_REUSEADDR говорит, что этот сокет можно привязать к адресу, даже если он уже привязан. Делать его перед закрытием сокета - бессмысленно. Изменять эту опцию имеет смысл только, если сокет создан, но ещё не привязан.

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

Отправить комментарий