поведение accept
От: homecat  
Дата: 14.01.13 11:12
Оценка:
При закрытии соединения клиентом, срабатывает accept и выдает как будто рабочий сокет и WSAGetLastError()=0. При попытке чтения из него получаю 10054 Connection reset by peer. Закрываю сокет и снова перехожу к accept — тишина. При следующем подключении клиента accept выдает тот же номер сокета как у предыдущего нерабочего.

Объясните плиз с чем это едят и как обрабатывают.
Re: поведение accept
От: homecat  
Дата: 14.01.13 11:16
Оценка:
Сокеты блокирующие, accept ждет пока клиент работает в отдельном потоке.
Re[2]: поведение accept
От: ononim  
Дата: 14.01.13 14:30
Оценка:
H>Сокеты блокирующие, accept ждет пока клиент работает в отдельном потоке.
видимо, пока он ждал пока там клиент отработает (а смысл ждать то, если поток отдельный? ) приходил еще ктото, постучался, ему не открыли, он и ушел..
Как много веселых ребят, и все делают велосипед...
Re: поведение accept
От: flamin  
Дата: 14.01.13 21:28
Оценка:
код в студию
Re[3]: поведение accept
От: homecat  
Дата: 15.01.13 06:32
Оценка:
Здравствуйте, ononim, Вы писали:

H>>Сокеты блокирующие, accept ждет пока клиент работает в отдельном потоке.

O>видимо, пока он ждал пока там клиент отработает (а смысл ждать то, если поток отдельный? ) приходил еще ктото, постучался, ему не открыли, он и ушел..

Тестирую на локалхосте и клиент пока один. Даже если бы ктото постучался accept сразу же его бы принял, но никто не стучится. Но как только клиент рвет соединение (может некорректно) срабатывает accept прямо в этот момент.

>(а смысл ждать то, если поток отдельный? )

accept ждет еще клиентов и передает их обработку в новый поток
но пока тестирую с одним клиентом.

код стандартный как будто

if ((client_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) <0)    
 {fprintf(stderr,"Cannot open socket %d\n",WSAGetLastError()); exit(1);}
 
memset (&addr, 0, sizeof (struct sockaddr_in));
addr.sin_family = AF_INET;
addr.sin_port = htons(5555);
addr.sin_addr.s_addr = inet_addr("127.0.0.1");

if ((bind (client_socket, (struct sockaddr *) &addr, sizeof (struct sockaddr_in)))!=0) 
{fprintf(stderr, "bind error %d \n", WSAGetLastError()); exit(1);}

lis = listen(client_socket,4);
if (lis!=0) {fprintf(stdout, "listen failed! %d\n",WSAGetLastError()); exit(1);}
fprintf(stdout, "\nlisten %d\n",lis );

worksocket = accept(client_socket,0,0);
if (worksocket <= 0){fprintf(stderr, "worksocket accept error %d\n", WSAGetLastError()); 
closesocket(worksocket);}

rec2 = recv(worksocket,buff1,1500,0);
if (rec2 <= 0) {fprintf(stderr, "worksocket recv error %d\n", WSAGetLastError());
closesocket(worksocket);}

и вот тут при разрыве соединения ошибка 10054 а при подключении все нормально
Re[4]: поведение accept
От: ononim  
Дата: 15.01.13 10:23
Оценка:
H>worksocket = accept(client_socket,0,0);
H>if (worksocket <= 0){fprintf(stderr, "worksocket accept error %d\n", WSAGetLastError());
H>closesocket(worksocket);}

H>rec2 = recv(worksocket,buff1,1500,0);

H>if (rec2 <= 0) {fprintf(stderr, "worksocket recv error %d\n", WSAGetLastError());
H>closesocket(worksocket);}
H>[/ccode]
H>и вот тут при разрыве соединения ошибка 10054 а при подключении все нормально
Не понял где ошибка 10054? из recv'а возвращается? Дык это нормально .
Как много веселых ребят, и все делают велосипед...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.