Проблемы после использования сервером accept () для принятия соединений - PullRequest
0 голосов
/ 25 сентября 2011

Я впервые использую сокеты, и у меня возникают проблемы с принятием соединений на стороне сервера.Мой сервер предназначен для приема только одного соединения за раз.Как только соединение получено, текущая дата и время записываются в сокет, а затем клиент распечатывает дату и время, которые он получил от сервера.Мой сервер имеет следующий код:

cout << "Server: Waiting for connections." << endl;
client_length = sizeof(client_address);
connection_fd = accept(listen_fd, (struct sockaddr*)&client_address, (socklen_t*)&client_length);
cout << "Server: Client connected" << endl;

Когда я запускаю свой сервер, я получаю следующий вывод:

./server&
Server: Waiting for connections.

Затем, когда я запускаю свой клиент, я получаю следующий вывод:

./client 127.0.0.1
Client: Connecting to: 127.0.0.1
Client: Connected to server.
Sun Sep 25 13:20:07 2011

Кажется, клиент печатает правильные данные, но сервер никогда не печатает, что клиент подключен.Что-то здесь не так.Другой симптом - когда я пытаюсь записать в канал (клиент пишет, сервер читает), клиент получает ошибку сломанного канала.Есть ли что-то, что мне не хватает?Если есть какой-либо код, который вы хотели бы увидеть, пожалуйста, спросите.

Редактировать: Здесь сервер работает под управлением strace.Кажется, ничего не происходит после распечатки accept.Странно?

write(2, "Server: Socket created.", 23Server: Socket created.) = 23
write(2, "\n", 1
)                       = 1
bind(3, {sa_family=AF_INET, sin_port=htons(4007), sin_addr=inet_addr("0.0.0.0")}, 16) = -1 EADDRINUSE (Address already in use)
write(2, "Server: Address and port bound t"..., 41Server: Address and port bound to socket.) = 41
write(2, "\n", 1
)                       = 1
listen(3, 100)                          = 0
write(2, "Server: Socket is now a listenin"..., 41Server: Socket is now a listening socket.) = 41
write(2, "\n", 1
)                       = 1
write(2, "Server: Waiting for connections.", 32Server: Waiting for connections.) = 32
write(2, "\n", 1
)                       = 1
accept(3,  

Спасибо.

Ответы [ 2 ]

1 голос
/ 25 сентября 2011

Ваш bind не работает с EADDRINUSE, но ваш сервер работает. Добавьте обработку ошибок в свой код и, возможно, измените используемый вами порт.

Также я предлагаю вам убедиться, что вы не привязываете один и тот же порт в клиенте случайно

1 голос
/ 25 сентября 2011

Этого не должно быть.

Сложно даже представить себе неисправный сценарий, например, у вас работает два экземпляра сервера, а другой принимает подключения, но тогда новый экземпляр не сможет снова использовать тот же номер порта, поэтому вы, вероятно, не проверяете возвращаемые значения системных вызовов, но затем accept должен потерпеть неудачу, и вы должны увидеть ложное сообщение, связанное с клиентом. Итак, какого чёрта вы делаете?

Обновление : yepp ... -1 EADDRINUSE (Address already in use)

Запущен другой экземпляр или что-то еще, использующее этот номер порта. Проверьте с netstat. И ради бога, проверьте возвращаемые значения этих вызовов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...