есть такой код:
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 говорит, что этот сокет можно привязать к адресу, даже если он уже привязан. Делать его перед закрытием сокета - бессмысленно. Изменять эту опцию имеет смысл только, если сокет создан, но ещё не привязан.
Комментариев нет:
Отправить комментарий