//---------------------------------------------------------------- bool TModuleClientLogic::WorkInherit() { InputFromSynchroPoint(); bool res = WorkClient(); res &= !NeedExit(); return res; }
void main() { WSADATA data; int on = 1, number, cnt=0; char buff[1024], str[1024]; SOCKET sock, client_sock = 0; DWORD dw = 1; int len; struct sockaddr_in addr; int sel_res; struct fd_set read_s, work; struct timeval time_out; int i; printf("Server with non blocked sockets\n"); if( WSAStartup(0x0202, &data) != 0) { DisplayError("WSAStartip"); } sock = socket(AF_INET, SOCK_STREAM, 0); if( sock == INVALID_SOCKET ) { DisplayError("socket"); } if( setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char *)&on, sizeof(on)) == SOCKET_ERROR ) { DisplayError("Set reusable socket"); } ioctlsocket(sock, FIONBIO, &dw); addr.sin_family = AF_INET; addr.sin_port = htons(555); addr.sin_addr.s_addr = 0; if( bind(sock, (struct sockaddr*) &addr, sizeof(addr)) != 0 ) { DisplayError("bind"); } if( listen(sock, 0x100) != 0 ) { DisplayError("listen"); } time_out.tv_sec = 0; time_out.tv_usec = 500000; //“аймаут 0.5 секунды. FD_ZERO (&work); while( 1) { switch(cnt % 4) { case 0: printf("-"); break; case 1: printf("\\"); break; case 2: printf("|"); break; case 3: printf("/"); break; } printf("\r"); cnt++; FD_ZERO (&read_s); FD_SET (sock, &read_s); //копируем все новые сокеты for(i=0; i<work.fd_count; i++) FD_SET(work.fd_array[i], &read_s); sel_res = select(0, &read_s, NULL, NULL, &time_out); if( (sel_res != 0) && !(FD_ISSET (sock, &read_s) )) //кто-то стучитс¤, но не дл¤ подключени¤ { for( i=0; i< read_s.fd_count; i++) { if( WorkClient(read_s.fd_array[i]) == -1 ) { printf("disconnect\n"); client_sock = 0; FD_CLR(read_s.fd_array[i], &work); //удал¤ем отключившегос¤ из рабочих сокетов } } } if ((sel_res!=0) && (FD_ISSET (sock, &read_s)) ) //кто-то хочет подключитьс¤ { client_sock = accept(sock, NULL, NULL); if( client_sock != SOCKET_ERROR ) { setsockopt( client_sock, SOL_SOCKET, SO_RCVTIMEO, ( const char * ) &time_out, sizeof( time_out ) ); setsockopt( client_sock, SOL_SOCKET, SO_SNDTIMEO, ( const char * ) &time_out, sizeof( time_out ) ); if( ioctlsocket(client_sock, FIONBIO, &dw) == SOCKET_ERROR ) { DisplayError("client_socket set nonBlock"); break; } send(client_sock, "test", 4, 0); printf("connected"); FD_SET(client_sock, &work); } } } getchar(); }