#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 секнуд не пришло коннекта на забинденный порт то закрывать сокет. Все мля перепробовал и какие тока извраты не делал так и не понял как сделать. Народ помогите с решением проблемы, код привел без лишнего бреда который я там накодел, чтобы легко можно было его исправить =)
Код:
int nAttempt = 0;
while (nAttempt <= 10)
{
consock = accept(sockid, (struct sockaddr *)&idsin, &i);
if (consock != INVALID_SOCKET)
{
MessageBox(NULL,"Connected to...","title",MB_OK);
break;
}
nAttempt++;
Sleep(500);
}
while (nAttempt <= 10)
{
consock = accept(sockid, (struct sockaddr *)&idsin, &i);
if (consock != INVALID_SOCKET)
{
MessageBox(NULL,"Connected to...","title",MB_OK);
break;
}
nAttempt++;
Sleep(500);
}
А после цикла просто проверяешь значение nAttempt и узнаешь причину завершения цикла.
Код:
DWORD dwEnd = GetTickCount()/1000 + 10 /* 10 sec */
while(dwEnd > GetTickCount()/1000)
{
....
}
while(dwEnd > GetTickCount()/1000)
{
....
}
Все равно не подходит нифига для решения моей задачи. Именно нужны таймауты.
Как то сделать точно можно но нифига не понимаю как. С неблокирующими сокетами както можно сделать но у меня не получается и с ним =(
Цитата: 4nob1oz
Ага с блокирующими сокетами цикл делать, оч смешно =) Скомпилил бы для начала и проверил.
Ну во-первых, цикл был в Вашем же исходники, я лишь чуть его подправил. ))
Во-вторых, подобный цикл сам по себе подразумевает использование неблокирующих сокетов, иначе зачем тогда вообще нужен такой цикл (с break'ом после первого же соединения).
В Вашем случае - возможно использование второго потока и какого- нибудь Event'а.
Цитата:
Никак не могу написать, чтобы если в течение 5 секнуд не пришло коннекта на забинденный порт то закрывать сокет. Все мля перепробовал и какие тока извраты не делал так и не понял как сделать. Народ помогите с решением проблемы, код привел без лишнего бреда который я там накодел, чтобы легко можно было его исправить =)
Асинхронные сокеты + WSAAccept
ПС C блокирующими для чтения записи работае setsockopt + SO_RCVTIMEO/SO_SNDTIMEO. Но хз как оно с аццептом пашет.
ППС синронные сокеты - зло.
Код:
#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;
}
#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;
}
Цитата: 4nob1oz
Че по делу посказать трудно чтоли =\ Я и так знаю функции и какие сокеты есть.
А что ж у тебя ioctlsocket(sockid, FIONBIO,&on_sock); не было в вопросе, если и так знаеш?
ДОКУ ЧИТАЙ!!
Код:
int i = 0, PAUSE = 200;
while (1)
{
if( (consock = accept(sockid, (struct sockaddr *)&idsin, &i)) == INVALID_SOCKET)
{
if(WSAGetLastError != WSAEWOULDBLOCK)
break; // socket error
Sleep(PAUSE);
++i;
if( i / (1000/PAUSE) >= 5)
{
printf("time out..\r\n");
break;
}
}
// получили конект
...
break;
}
while (1)
{
if( (consock = accept(sockid, (struct sockaddr *)&idsin, &i)) == INVALID_SOCKET)
{
if(WSAGetLastError != WSAEWOULDBLOCK)
break; // socket error
Sleep(PAUSE);
++i;
if( i / (1000/PAUSE) >= 5)
{
printf("time out..\r\n");
break;
}
}
// получили конект
...
break;
}