#include <stdio.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <errno.h>
#define N 64
typedef struct sockaddr SA;
int main(int argc,char *argv[])
{
int listenfd,connfd[16],i = 0,maxfd;
int n;
struct sockaddr_in myaddr,peeraddr,connaddr;
socklen_t peerlen = sizeof(connaddr),connlen = peerlen;
char buf[N];
fd_set readfd,fdsetbak;
bzero(connfd,sizeof(connfd));
// if(argc < 3)
// {
// printf("Usage: %s <IP> <Port>\n",argv[0]);
// exit(-1);
// }
if((listenfd = socket(PF_INET,SOCK_STREAM,0)) < 0)
{
perror("socket error");
exit(-1);
}
bzero(&myaddr, sizeof(myaddr));
myaddr.sin_family = PF_INET;
myaddr.sin_port = htons(atoi("9090"));
myaddr.sin_addr.s_addr = inet_addr("192.168.0.103");
// myaddr.sin_port = htons(atoi(argv[2]));
// myaddr.sin_addr.s_addr = inet_addr(argv[1]);
if(bind(listenfd, (SA *)&myaddr, sizeof(myaddr)) < 0)
{
perror("fail to bind");
exit(-1);
}
if(listen(listenfd, 16) < 0)
{
perror("fail to listen");
exit(-1);
}
FD_ZERO(&readfd);
FD_SET(listenfd,&readfd);
maxfd = listenfd;
fdsetbak = readfd;
while(1)
{
readfd = fdsetbak;
if(select(maxfd+1, &readfd, NULL,NULL,NULL) < 0)
{
perror("fail to select");
exit(-3);
}
if(FD_ISSET(listenfd,&readfd))
{
i = 0;
while(connfd[i])
{
i++;
if(i>=16) break; // chao chu 16;
}
if((connfd[i] =accept(listenfd,(SA *)&peeraddr,&peerlen)) < 0)
{
perror("fail to accept");
i = 0;
exit(-2);
}
FD_SET(connfd[i],&readfd);
fdsetbak = readfd;
maxfd = maxfd>connfd[i] ? maxfd:connfd[i];
getsockname(connfd[i],(SA *)&connaddr,&connlen);
printf("new connect from [%s:%d]to[%s:%d]\n",inet_ntoa(peeraddr.sin_addr),ntohs(peeraddr.sin_port),inet_ntoa(connaddr.sin_addr),ntohs(connaddr.sin_port));
}
else
{
for(i = 0;i<16;i++)
{
if(connfd[i])
{
if(FD_ISSET(connfd[i],&readfd))
{
if((n = recv(connfd[i],buf,N,0)) <=0)
{
getpeername(connfd[i],(SA *)&peeraddr,&peerlen);
printf("[%s:%d] closed\n",inet_ntoa(peeraddr.sin_addr),ntohs(peeraddr.sin_port));
FD_CLR(connfd[i],&fdsetbak );
readfd = fdsetbak;
close(connfd[i]);
connfd[i] = 0;
}
else
{
printf("send to %d\n",connfd[i]);
send(connfd[i],buf,n,0);
}
}
}
}
}
}
return 0;
}
筛选式的使用FD_ISSET不行吗?
非要
for(i=0;i<maxfd+1;i++)
{
FD_ISSET();
{
}
}
才行吗?