1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
|
SOCKET AcceptTimeout(SOCKET s, struct sockaddr * addr, int addrlen, long ms)
{
u_long val = 1;
struct timeval tv;
fd_set readfds;
int result;
tv.tv_sec = 0;
tv.tv_usec = ms * 1000;
ioctlsocket(s, FIONBIO, &val);
FD_ZERO(&readfds);
FD_SET(s, &readfds);
result = select(s + 1, &readfds, NULL, NULL, &tv);
if (result == 1 && FD_ISSET(s, &readfds))
{
return accept(s, (struct sockaddr*) addr, &addrlen);
}
else
{
if (result != SOCKET_ERROR) WSASetLastError(WSAETIMEDOUT);
return INVALID_SOCKET;
}
}
int main(void)
{
WSADATA wsaData;
SOCKET serverSocket, recvSocket;
struct sockaddr_in local = { 0 };
struct sockaddr_in remote = { 0 };
WSAStartup(0x202,&wsaData);
local.sin_family = AF_INET;
local.sin_port = htons(80);
local.sin_addr.s_addr = INADDR_ANY;
serverSocket = socket(AF_INET, SOCK_STREAM, 0);
bind(serverSocket, (struct sockaddr *) &local, sizeof(local));
listen(serverSocket, SOMAXCONN);
recvSocket = AcceptTimeout(serverSocket, (struct sockaddr *) &remote , sizeof(remote), 5000);
if (recvSocket == INVALID_SOCKET)
{
printf("AcceptTimeout Erreur: %d\n", WSAGetLastError());
}
else
{
u_long val = 0;
char buf[512];
int cnt;
printf("AcceptTimeout a réussi. Addr: %s\n", inet_ntoa(remote.sin_addr));
// rechange socket en bloquant
ioctlsocket(recvSocket, FIONBIO, &val);
cnt = recv(recvSocket, buf, sizeof(buf) - 1, 0);
if (cnt > 0)
{
buf[cnt] = '\0';
printf("\n%s\n", buf);
}
else
{
printf("recv Erreur: %d\n", WSAGetLastError());
}
}
getchar();
return 0;
} |
Partager