TCP Select Sever
#include <stdio.h>
#include <sys/socket.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <string.h>
#define PORT 5001
int main()
{
int sockfd = -1;
fd_set rfds,wfds,trfds,twfds;
int maxfd = -1;
int s_res = 0;
ssize_t res = 0;
char buf[128] = "";
int client_sockfd;
int client_num = 0;
int client_sockfds[10] = {0};
int kk = 0;
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) {
printf("socket err!\n");
return -1;
}
struct sockaddr_in sin;
struct sockaddr_in cin;
sin.sin_family = AF_INET;
sin.sin_port = htons(PORT);
sin.sin_addr.s_addr = INADDR_ANY;
socklen_t addrlen = sizeof(cin);
if (bind(sockfd, (struct sockaddr *)&sin, sizeof(sin)) < 0) {
printf("bind err!\n");
close(sockfd);
return -1;
}
if (listen(sockfd, 1024) < 0) {
printf("listen err!\n");
close(sockfd);
return -1;
}
FD_ZERO(&rfds);
FD_ZERO(&wfds);
FD_ZERO(&trfds);
FD_ZERO(&twfds);
FD_SET(sockfd, &rfds);
maxfd = sockfd;
while(1) {
trfds = rfds;
twfds = wfds;
s_res = select(maxfd+1, &trfds, &twfds, NULL, NULL);
if (s_res < 0) {
printf("select err!\n");
return -1;
} else if (s_res == 0) {
printf("select time out!\n");
return -1;
}
if (FD_ISSET(sockfd, &trfds)) {
client_sockfd = accept(sockfd, (struct sockaddr *)&cin, &addrlen);
if (client_sockfd < 0) {
printf("accept err!\n");
return -1;
}
printf("[%s:%d] newfd=%d 客户端连接成功 LINE:%d\n",inet_ntoa(cin.sin_addr), ntohs(cin.sin_port), client_sockfd);
FD_SET(client_sockfd, &rfds);
maxfd = (maxfd > client_sockfd ? maxfd:client_sockfd);
client_num++;
}
printf("client_num = %d, maxfd = %d\n",client_num, maxfd);
for (int ii = sockfd+1; ii <= maxfd; ii++) {
if(FD_ISSET(ii, &trfds)) {
res = recv(ii, buf, sizeof(buf), 0);
if (res < 0) {
printf("ii = %d, recv err!\n", ii);
return -1;
} else if (res == 0) {
close(ii);
FD_CLR(ii, &rfds);
client_num--;
printf("ii = %d close, client_num = %d\n", ii, client_num);
kk = maxfd;
for (; kk >= 0; kk--) {
if (FD_ISSET(kk, &rfds)) {
break;
}
}
maxfd = kk;
} else {
printf("[%s:%d] newfd=%d:%s LINE:%d\n",inet_ntoa(cin.sin_addr), ntohs(cin.sin_port), ii, buf);
memset(buf, 0, sizeof(buf));
if (send(ii, "hello world", sizeof("hello world"), 0) < 0) {
printf("send err!\n");
return -1;
}
}
}
}
}
close(sockfd);
return 0;
}