您的位置:首页 > 其它

socket学习笔记——select函数的使用(windows)

2015-08-18 12:19 281 查看
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winsock2.h>

#define BUF_SIZE 1024
void error_handling(char* message);

int main(int argc, char* argv[])
{
WSADATA wsadata;
SOCKET hServSock, hClntSock;
SOCKADDR_IN servAddr, clntAddr;
TIMEVAL timeout;
fd_set reads, cp_reads;

int adr_sz;
int str_len, i,fd_num;
char buf[BUF_SIZE];

if (argc != 2)
{
printf("usage:%s <port>\n",argv[0]);
exit(1);
}
if (WSAStartup(MAKEWORD(2, 2), &wsadata) != 0)
error_handling("WSAStartup error");

hServSock = socket(PF_INET, SOCK_STREAM, 0);
memset(&servAddr, 0, sizeof(servAddr));
servAddr.sin_family = AF_INET;
servAddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
servAddr.sin_port = htons(atoi(argv[1]));

if (bind(hServSock, (SOCKADDR*)&servAddr, sizeof(servAddr)) == SOCKET_ERROR)
error_handling("bind error");
if (listen(hServSock, 5) == SOCKET_ERROR)
error_handling("listen error");

FD_ZERO(&reads);
FD_SET(hServSock, &reads);

while (1)
{
cp_reads = reads;
timeout.tv_sec = 5;

if ((fd_num = select(0, &cp_reads, 0, 0, &timeout)) == SOCKET_ERROR)
break;
if (fd_num == 0)
continue;

for (i = 0;i < reads.fd_count;i++)
{
if (FD_ISSET(reads.fd_array[i], &cp_reads))
{
if (reads.fd_array[i] == hServSock)
{
adr_sz = sizeof(clntAddr);
hClntSock = accept(hServSock, (SOCKADDR*)&servAddr, &adr_sz);
FD_SET(hClntSock, &reads);
printf("connected client:%d\n", hClntSock);
}
else
{
str_len = recv(reads.fd_array[i], buf, BUF_SIZE - 1, 0);
if (str_len == 0)
{
FD_CLR(reads.fd_array[i], &reads);
closesocket(cp_reads.fd_array[i]);
printf("closed client:%d\n", cp_reads.fd_array[i]);
}
else
send(reads.fd_array[i], buf, str_len, 0);
}
}
}
}
closesocket(hServSock);
WSACleanup();
return 0;
}

void error_handling(char* message)
{
fputs(message, stderr);
fputc('\n', stderr);
exit(1);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: