2013-12-05 4 views
0

У меня есть приложение TCP, написанное на C++, где клиент и сервер обмениваются данными. Я назначил сокет, полагая, что он по умолчанию блокировал бы блокировку; напротив, после того, как сервер ждет клиента, у меня есть тот клиент, который вызывает функцию recv, не дожидаясь данных. Это код, в котором я инициализирую сокет fr клиента.Неблокирующие сокеты, даже если они явно не устанавливаются как неблокирующие.

int TCPreceiver::initialize(char* address, int port) 
{ 
    sock = socket (AF_INET, SOCK_STREAM, 0); 
    cout << "Socket: " << sock << endl; 
    sockaddr_in target; 
    target.sin_family = AF_INET; 
    target.sin_port = htons (port); 
    target.sin_addr.s_addr = inet_addr(address); 

    int fails=0; 
    while (connect(sock, (sockaddr*) &target, sizeof(target)) == -1) 
    { 
     fails++; 
     if (fails==10) 
     { 
      close(sock); 
      cout << "Error with connection to the server, try again"<< endl; 
      exit(-1); 
     } 
    } 

    cout << "Client connected (control channel)" << endl; 

    unsigned char text[10]; //Request message 
    //fill text[] 
    if(send(sock, (char*)text, 10, 0)==-1) 
    { 
      printf("send() failed with error code : %d" , -1); 
      exit(EXIT_FAILURE); 
    } 

    return 0; 
} 

Я попытался добавить этот код:

int opts; 
opts = fcntl(sock,F_GETFL); 
if (opts < 0) { 
    perror("fcntl(F_GETFL)"); 
    exit(0); 
} 
opts = (opts & (~O_NONBLOCK)); 
if (fcntl(sock,F_SETFL,opts) < 0) { 
    perror("fcntl(F_SETFL)"); 
    exit(0); 
} 

, но он по-прежнему не работает, и если я называю ПРИЕМ(), приложение не блокирует (и RECV() всегда возвращает 0). Вот функция, в которой я вызываю recv():

void TCPreceiver::receive(char* text, int& dim) 
{ 
    int ret; 

    ret = recv(sock, text, dim, 0); 
    dim=ret; 
    if(ret == -1){ 
     printf("recv() failed with error (%d)\n", ret); 
     //system("PAUSE"); 
     exit(1); 
    } 
} 

Где я ошибаюсь?

ответ

3

Возврат нулевого значения recv() означает, что (1) вы прошли нулевую длину, что является просто ошибкой программирования, о которой я не буду говорить дальше, или (2) конец потока. У партнера есть соединение. Это не является неблокирующей ситуацией, это конец соединения. Вы должны закрыть розетку и прекратить ее использовать. Он никогда ничего не вернет. Это снова нулевой.

мужчина страница.

+0

** Проблема решена **: в recv() я передал аргумент dim, который равен 0. @EJP, благодарю вас за обращение ко мне по правильному источнику проблемы. – user2552904

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