Чтение данных из сокета - PullRequest
       31

Чтение данных из сокета

1 голос
/ 29 апреля 2010

У меня проблемы с чтением данных из сокета. Предположительно, есть серверный сокет, который ожидает подключения клиентов. Когда я записываю клиента в connect() в сокет / порт сервера, кажется, что я подключен. Но когда я пытаюсь read() данных, которые сервер предположительно записывает в сокет, функция read() зависает, пока приложение сервера не будет остановлено.

Почему вызов read () будет зависать, если сокет подключен? Я считаю, что я никогда не был подключен к сокету / порту, но не могу доказать это, поскольку вызов connect () не вернул ошибку. Вызов read () также не возвращает ошибку, просто он вообще не возвращается.

Ответы [ 4 ]

3 голосов
/ 29 апреля 2010

Чтение блокируется, пока не получит некоторый ввод-вывод (или ошибку).

2 голосов
/ 29 апреля 2010

Как упоминал John & Whirl, проблема почти наверняка в том, что сервер не отправил никаких данных для вашего read() вызова для возврата. Еще одна простая вещь, которую нельзя упускать из виду при начале сетевого программирования, состоит в том, что данные, передаваемые при вызове write() на сервере, не всегда симметричны вызову read() клиента. Если сервер может write("hello world"), ваш read() может легко вернуть "hello world", "hello wo", "hel" или даже просто "h"

1 голос
/ 29 апреля 2010

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

Вы также можете использовать netstat (я использую его с -f inet), чтобы выяснить, какие соединения были сделаны, и увидеть состояние вашего сокетного соединения.

0 голосов
/ 29 апреля 2010

Ваш сервер, вероятно, не записывает данные в сокет, поэтому ваш ридер просто блокирует ожидание появления данных в сокете.

...