2013-04-05 2 views
0

Мое приложение - многопользовательская программа чата Echo. Если клиент отправляет сообщение, сервер отправляет всем клиентам, включая клиент, с которого происходит сообщение. Он реализован в c.первый tcp echo клиент не может связываться со вторым tcp echo client (Bad file descriptor)

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

Когда есть один клиент, сообщение правильно возвращается эхо. Когда второй клиент присоединяется и отправляет сообщение, он эхо возвращается к двум клиентам правильно.

Когда первый клиент посылает сообщение его обратно Передано первому клиенту правильно .Но когда пытался отправить это сообщение на втором клиенте не удалось с ошибкой Bad дескриптора файла

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

как исправить это?

ответ

1

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

Кроме того, результаты двух процессов, пытающихся отправить одно и то же TCP-соединение одновременно, не определены. Например, данные могут чередоваться.

Так что ваш дизайн в основном сломан.

Вы действительно можете разделить сокеты. Как вы это делаете, зависит от платформы. Вам также необходимо будет использовать некоторую форму IPC для арбитража, который процесс может записывать в сокет. Например, вы можете использовать семафор для каждого сокета.

+0

Я поделился переменной sockaddr_in от второго аргумента accept(). Но нам нужен дескриптор файла для отправки(). –

+0

@Sankaran: переменная 'sockaddr_in' является * адресом * сокета. Разделив его, вы просто сказали другим процессам, что такое адрес вашего сокета. Это, конечно же, не разделяет сам сокет. –

Смежные вопросы