📄 ioserver.c
字号:
#include <stdio.h>#include <unistd.h>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#define PORT 1234#define BACKLOG 5#define MAXDATASIZE 1000typedef struct _CLINET { int fd; char *name; struct sockaddr_in addr; char *data;}CLIENT;void savedata(char *recvbuf, int len, char *data){ static int index=0; int i; for(i=0;i<len-1;i++) { data[index++] = recvbuf[i]; } data[index] = '\0';// printf("Message is : %s from %s \n", data, inet_ntoa(client[i].addr.sin_addr));//printf("Client (%s) closed connection. User data: %s\n", client[i].name, client[i].data);}void process_cli(CLIENT *client, char *recvbuf, int len){ savedata(recvbuf, len, client->data); send(client->fd, recvbuf, MAXDATASIZE, 0);}int main(void) { int i, maxi, maxfd, sockfd; int nready; int n; fd_set rset, allset; int listenfd, connectfd; struct sockaddr_in server; CLIENT client[FD_SETSIZE]; char recvbuf[MAXDATASIZE]; int sin_size; /* Create TCP socket */ if((listenfd=socket(AF_INET, SOCK_STREAM, 0))==-1) { perror("Create socket failed"); exit(-1); } /* Bind address */ int opt = SO_REUSEADDR; setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)); bzero(&rset,sizeof(rset)); bzero(&allset,sizeof(allset)); bzero(&server, sizeof(server)); bzero(client, FD_SETSIZE); bzero(recvbuf,MAXDATASIZE); server.sin_family = AF_INET; server.sin_port = htons(PORT); server.sin_addr.s_addr = htonl(INADDR_ANY); if (bind(listenfd, (struct sockaddr *)&server, sizeof(struct sockaddr))==-1) { perror("Bind error."); exit(-1); } /* Listen socket listenfd */ if (listen(listenfd, BACKLOG) == -1) { perror("listen error"); exit(-1); } sin_size = sizeof(struct sockaddr_in); maxfd = listenfd; maxi = -1; for (i =0; i< FD_SETSIZE; i++) client[i].fd = -1; FD_ZERO(&allset); FD_SET(listenfd, &allset); while (1) { struct sockaddr_in addr; bzero(&addr, sizeof(addr)); rset = allset; nready = select (maxfd+1, &rset, NULL, NULL, NULL); if (FD_ISSET(listenfd, &rset)) { if ((connectfd = accept(listenfd, (struct sockaddr *)&addr, &sin_size)) == -1) { perror("accept error"); continue; } for (i = 0; i < FD_SETSIZE; i++) if (client[i].fd < 0) { client[i].fd = connectfd; client[i].name = (char*)malloc(MAXDATASIZE); client[i].addr = addr; client[i].data = (char*)malloc(MAXDATASIZE); client[i].name[0] = '\0'; client[i].data[0] = '\0'; printf("You got a connect from %s. And the port is %d\n", inet_ntoa(client[i].addr.sin_addr), ntohs(client[i].addr.sin_port)); break; } if (i == FD_SETSIZE) printf("too many cllients.\n"); FD_SET(connectfd, &allset); if (connectfd > maxfd) maxfd = connectfd; if (i > maxi) maxi =i; if ( -- nready <=0) continue; /*可以省略?*/ } /* if (FD_ISSET (listenfd… */ for (i = 0; i <= maxi; i++) { if ((sockfd = client[i].fd) < 0) continue; if (FD_ISSET(sockfd, &rset)) { if (( n = recv(sockfd, recvbuf, MAXDATASIZE, 0)) ==0) { close(sockfd); printf("Client (%s) closed connection. User data: %s\n", client[i].name, client[i].data); FD_CLR(sockfd, &allset); client[i].fd = -1; free(client[i].name); free(client[i].data); } else process_cli(&client[i], recvbuf, n); //printf("Client (%s) closed connection. User data: %s\n", client[i].name, client[i].data); if ( --nready <=0 ) break; /*???*/ } /* if (FD_ISSET(sockfd, &rset)) */ } /* for(i = 0; i <= maxi; i++) */ } /* while(1); */ close(listenfd);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -