У меня есть приложение 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);
}
}
Где я ошибаюсь?
** Проблема решена **: в recv() я передал аргумент dim, который равен 0. @EJP, благодарю вас за обращение ко мне по правильному источнику проблемы. – user2552904