Народ никак не могу додуматься уже 2-ой день. Вот код Код (Text): #include <windows.h> #include <stdio.h> #pragma comment(lib,"ws2_32.lib") #pragma comment(linker,"/entry:main") int main(int argc, char* argv[]) { WSADATA wsaData; SOCKET sockid,consock; struct sockaddr_in idsin; int i=0; idsin.sin_family = AF_INET; idsin.sin_addr.s_addr = 0; idsin.sin_port = htons(4444); i = sizeof(idsin); WSAStartup(MAKEWORD(2,2), &wsaData); sockid = socket(AF_INET, SOCK_STREAM, 0); if (sockid == INVALID_SOCKET) { printf("Can't create socket...\n"); return 0; } bind(sockid,(struct sockaddr *)&idsin, i); listen(sockid, 10); while (1) { consock = accept(sockid, (struct sockaddr *)&idsin, &i); if (consock != INVALID_SOCKET) { MessageBox(NULL,"Connected to...","title",MB_OK); break; } Sleep(500); } return 0; } Никак не могу написать, чтобы если в течение 5 секнуд не пришло коннекта на забинденный порт то закрывать сокет. Все мля перепробовал и какие тока извраты не делал так и не понял как сделать. Народ помогите с решением проблемы, код привел без лишнего бреда который я там накодел, чтобы легко можно было его исправить =)
Выносишь цикл ожидания в другой тред, создаешь событие, в основном треде вставляешь вызов WaitForSingleObject(hEvent, 5000), в новом потоке, по выходу из цикла инициируешь эвент, примерно так: hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); hThrd = CreateThread(..); if (WaitForSingleObject(hEvent, 5000)==WAIT_TIMEOUT) { MessageBox(NULL,"Timeout","title",MB_OK); return ..; } (это вместо цикла и listen, сам по ситуации смотри не хочется вникать; цикл выносишь в функцию потока)
протев, есть для этого команды уровня ioctlsocket( sock , FIONBIO, "\x01\x00\x00\x00" )//тока нонблокин и FD_SET(..,..)
Угу спасибо за советы. Не так то просто было разобраться но вроде получилось =) Тоже сначала с эвентами подсказали сделать но как то эту идею отложил я на потом. Вот код Код (Text): #include <windows.h> #include <stdio.h> #pragma comment(lib,"ws2_32.lib") #pragma comment(linker,"/entry:main") #define PORT 4444 int main(int argc, char* argv[]) { WSADATA wsaData; SOCKET sockid,consock; struct sockaddr_in idsin; struct timeval tv; fd_set sock; unsigned long on_sock = 1,off_sock = 0; int i=0; ZeroMemory(&tv,sizeof(tv)); WSAStartup(MAKEWORD(2,2), &wsaData); i = sizeof(idsin); tv.tv_sec = 5; idsin.sin_family = AF_INET; idsin.sin_addr.s_addr = inet_addr("127.0.0.1"); idsin.sin_port = htons(PORT); sockid = socket(AF_INET, SOCK_STREAM, 0); if (sockid == INVALID_SOCKET) { printf("Can't create socket...\n"); return 0; } ioctlsocket(sockid, FIONBIO,&on_sock); bind(sockid,(struct sockaddr *)&idsin, i); listen(sockid, 10); FD_ZERO(&sock); FD_SET(sockid,&sock); while (1) { consock = accept(sockid, (struct sockaddr *)&idsin, &i); if(select(sockid+1, &sock, NULL, NULL, &tv )==0) { printf("\nConnection timed out in %d sec...\n",tv.tv_sec); break; } if (consock != INVALID_SOCKET) { printf("\nClient connected...\n"); break; } Sleep(1000); } ioctlsocket(sockid, FIONBIO, &off_sock); closesocket(sockid); WSACleanup(); return 0; } Цикл и Sleep можно убрать вообще но и так тоже работает. Может кому и пригодится кодес =)
наш человек! мсрем тоже так делал! .) а слип оставь на 10мс, ибо если переглючит всех, то проц не будет грузиться со всей системой сокетов.