tcp 使用select 治理客户端
tcp 使用select 管理客户端
想通过select函数管理客户端是否有数据传来。
帮忙看下这个用法有什么问题????
想通过select函数管理客户端是否有数据传来。
帮忙看下这个用法有什么问题????
typedef struct _t_client
{
int fd;
struct sockaddr_in addr;
}tClient;
//用户集合
tClient client[FD_SETSIZE];
int Init_tcp_server();
int process_data(tClient * pClient);
int main()
{
int i = 0;
for(i = 0; i < FD_SETSIZE; i++)
{
client[i].fd = -1;
memset(&client[i].addr, 0, sizeof(struct sockaddr_in));
}
Init_tcp_server();
}
int Init_tcp_server()
{
int i = 0;
int sockfd = 0;
int listenfd = 0;
int connectfd = 0;
int maxi = 0;
int maxfd = 0;
fd_set rset, allset;
socket_len sin_size = 0;
int nready = 0;
int recv_byte = 0;
char recvbuf[1024] = {0};
char temp[32] = {0};
struct sockaddr_in svraddr;
struct sockaddr_in cliaddr;
struct timeval wait;
sin_size = sizeof(struct sockaddr_in);
listenfd = socket(AF_INET, SOCK_STREAM, 0);
if(listenfd < 0)
{
perror("Create tcp socket fail!");
exit(1);
}
memset(&svraddr, 0, sizeof(struct sockaddr_in));
svraddr.sin_family = AF_INET;
svraddr.sin_port = htons(4321);
svraddr.sin_addr.s_addr = INADDR_ANY;
if(bind(listenfd, (struct sockaddr *)&svraddr, sizeof(svraddr) == -1)
{
perror("Bind fail!");
close(listenfd);
exit(1);
}
if(listen(listenfd, 5) == -1)
{
perror("Listen fail!");
close(listenfd);
exit(1);
}
maxfd = listenfd;
FD_ZERO(&allset);
FD_SET(listenfd, &allset);
while(1)
{
wait.tv_sec = 5;
wait.tv_usec = 0;
rset = allset;
if(FD_ISSET(listenfd, &allset))
{
memset(cliaddr, 0, sizeof(struct sockaddr_in));
if( (connectfd = connect(listenfd, (struct sockaddr *)&cliaddr, &sin_size)) == -1 )
{
perror("Connect fail!");
continue;
}
inet_ntop(AF_INET, &cliaddr.sin_addr, temp, 32);
printf(" [%s] [%d] connected!\n", temp, ntohs(cliaddr.sin_port));
for(i = 0; i < FD_SETSIZE; i++)
{
if(client[i].fd < 0)
{
client[i].fd= connectfd;
client[i].addr = cliaddr;
}