При закрытии соединения клиентом, срабатывает accept и выдает как будто рабочий сокет и WSAGetLastError()=0. При попытке чтения из него получаю 10054 Connection reset by peer. Закрываю сокет и снова перехожу к accept — тишина. При следующем подключении клиента accept выдает тот же номер сокета как у предыдущего нерабочего.
Объясните плиз с чем это едят и как обрабатывают.
Здравствуйте, 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 а при подключении все нормально
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'а возвращается? Дык это нормально
.