#include <stdio.h>
#include <fcntl.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <sys/select.h>
#include <sys/types.h>
#define server_port 8000
#define SIZE 100
#define block 5
int ServerBuildSockt(int port)
{
int sock_fd;
struct sockaddr_in servaddr;
if((sock_fd = socket(AF_INET,SOCK_STREAM,0)) == -1){
printf("socket error\n");
return -1;
}
memset(&servaddr,0,sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(port);
if(bind(sock_fd,(struct sockaddr*)&servaddr,sizeof(servaddr)) == -1){
printf("bind error!\n");
return -1;
}
if(listen(sock_fd,block) == -1){
printf("listen error!");
return -1;
}
return sock_fd;
}
int main()
{
//struct sockaddr_in servaddr,cliaddr;
struct sockaddr_in cliaddr;
socklen_t cliaddr_len;
int sock_fd,new_fd;
char buf[SIZE];
char buf_addr[SIZE];
int n,i = 0;
int ret;
sock_fd = ServerBuildSockt(server_port);
printf("wating for connect..\n");
cliaddr_len = sizeof(cliaddr);
fd_set fdr;
struct timeval tv;
int fd[block];
int count = 0;
int maxfd = sock_fd;
memset(fd,0,sizeof(fd));
while(1){
FD_ZERO(&fdr);
FD_SET(sock_fd,&fdr);
tv.tv_sec = 10;
tv.tv_usec = 0;
//add active connection to fd set
for(i = 0; i < block; i++){
if(fd[i] != 0 ){
FD_SET(fd[i],&fdr);
}
}
ret = select(maxfd + 1,&fdr,NULL,NULL,&tv);
if(ret < 0){
printf("select error!\n");
break;
}
else if(ret == 0)
continue;
//check every fd in the set
for(i = 0; i<count;i++){
if(FD_ISSET(fd[i],&fdr)){
memset(buf,0,SIZE);
ret = recv(fd[i],buf,SIZE,0);
if(ret <= 0){
printf("connect[%d] close!\n",i);
close(fd[i]);
FD_CLR(fd[i],&fdr);
fd[i] = 0;
}
else{
printf("connect[%d] send : %s\n",i,buf);
}
}
}
if(FD_ISSET(sock_fd,&fdr)){
new_fd = accept(sock_fd,(struct sockaddr*)&cliaddr,&cliaddr_len);
if(new_fd <= 0){
printf("accept error!\n");
continue;
}
if(count < block){
fd[count++] = new_fd;
printf("new connection client[%d] %s:%d\n",count,inet_ntoa(cliaddr.sin_addr),ntohs(cliaddr.sin_port));
if(new_fd > sock_fd)
maxfd = new_fd;
}
else{
printf("max connection arrive,exit\n");
send(new_fd,"bye",4,0);
close(new_fd);
break;
}
}
}
close(sock_fd);
return 0;
}
select socket
最新推荐文章于 2023-01-15 16:55:48 发布