#include<stdio.h>
#include<stdlib.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<unistd.h>
#include<string.h>
#define SIZE 30
int tcp_socket(int port);
int main(int argc,char *argv[])
{
if(argc != 2)
{
printf("+ port\n");
return 1;
}
int sock = tcp_socket( atoi(argv[1]) );
if (sock == -1)
{
printf("socket error\n");
return 1;
}
int r;
fd_set reads,temp;
socklen_t len;
int fd_max,i;
struct timeval timeout;
char buf[SIZE];
FD_ZERO(&reads);
FD_SET(sock,&reads);
fd_max=sock;
struct sockaddr_in cli_addr;
while(1)
{
temp=reads;
timeout.tv_sec=5;
timeout.tv_usec=0;
printf("fd_max = %d\n", fd_max);
r=select(fd_max+1, &temp, NULL, NULL, &timeout);
if(r == -1)
break;
else if(r == 0)
{
printf("time out! 5s\n");
continue;
}
else
{
for(i = 3; i < fd_max+1; i++)
{
if(FD_ISSET(i,&temp))
{
if(i == sock)
{
len=sizeof(cli_addr);
int cli_sock=accept(sock,(struct sockaddr*)&cli_addr,&len);
if(cli_sock == -1)
continue;
FD_SET(cli_sock,&reads);
if(fd_max < cli_sock)
fd_max=cli_sock;
printf("new client fd=%d\n",cli_sock);
}
else{
memset(buf,0,SIZE);
r=read(i,buf,SIZE-1);
if(r == 0)
{
FD_CLR(i,&reads);
close(i);
printf("closed client fd:%d\n",i);
}
else if(r > 0){
write(i,buf,r);
buf[r]='\0';
printf("recv from client %d: %s\n",i,buf);
}
else {
printf("read error\n");
exit(1);
}
}
}
}
}
}
close(sock);
return 0;
}
int tcp_socket(int port){
int sock;
struct sockaddr_in addr;
memset(&addr,0,sizeof addr);
addr.sin_family=AF_INET;
addr.sin_addr.s_addr=htonl(INADDR_ANY);
addr.sin_port=htons(port);
sock=socket(AF_INET,SOCK_STREAM,0);
const int on=1;
if (setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,&on,sizeof on))
{
printf("setsockopt\n");
return -1;
}
int r = bind(sock,(struct sockaddr*)&addr,sizeof(addr));
if(r == -1)
return -1;
r=listen(sock,10);
if(r == -1)
return -1;
return sock;
}