Проблема программирования сокетов - PullRequest
1 голос
/ 12 октября 2009

Я реализовал клиентский сервер с помощью программирования сокетов в C на Unix OS. Я использовал неблокирующий сокет на стороне клиента. Я хочу реализовать двустороннюю связь. Но он работает только одним способом: клиент может читать и записывать данные на сервере, а сервер не может читать или записывать данные на клиенте.

Клиент

nread = recv(sock, ptr, nleft, MSG_DONTWAIT))
send(sock, ptr, nleft, 0))

Сервер

recv(sock, ptr, nleft, MSG_DONTWAIT))
SockWrite(sock, Message, dataLength)

Сервер всегда сталкивается с проблемой при чтении. Кто-нибудь может мне объяснить, почему и как от этого избавиться?

Ответы [ 3 ]

1 голос
/ 12 октября 2009

Ожидание готового сокета для чтения или записи с использованием select () call.

0 голосов
/ 12 октября 2009

примеров кода

static void SetNonBlock(const int nSock, bool bNonBlock)
{
    int nFlags = fcntl(nSock, F_GETFL, 0);
    if (bNonBlock) {
        nFlags |= O_NONBLOCK;
    } else {
        nFlags &= ~O_NONBLOCK;
    }

    fcntl(nSock, F_SETFL, nFlags);
}

     ...
     SetNonBlock(sock, true);
     ...
    int code = recv(sock, buf, len_expected, 0);
    if(code > 0) {
            here got all or partial data
    } else if(code < 0) {
        if((errno != EAGAIN) && (errno != EINPROGRESS) ) {
                         here handle errors
        }
              otherwise may try again       
    } else if(0 == code) {
        FIN received, close the socket
    }
0 голосов
/ 12 октября 2009

Какой код возврата в recv? Вы установили неблокирующее гнездо recv? В этом случае вы, вероятно, видите EAGAIN, и вам нужно выбрать () и т. Д. Или вернуться к блокировке. Я бы не рекомендовал игнорировать возвращаемые значения для системных вызовов.

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