#include
#include
#include
#include
#include
#include
#include
#include
int main()
{int lfd = socket(AF_INET, SOCK_STREAM, 0);int opt = 1;setsockopt(lfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));struct sockaddr_in server_addr;bzero(&server_addr, sizeof(server_addr)); server_addr.sin_family = AF_INET;server_addr.sin_port = htons(8888);server_addr.sin_addr.s_addr = htonl(INADDR_ANY);bind(lfd, (struct sockaddr*)&server_addr, sizeof(server_addr));listen(lfd, 128);int client[FD_SETSIZE]; int i; for(i = 0; i< FD_SETSIZE; i++)client[i] = -1; fd_set set, orgset; FD_ZERO(&orgset);FD_SET(lfd, &orgset); int nfds = lfd; struct sockaddr_in client_addr;socklen_t client_len = sizeof(client_addr); char buf[BUFSIZ] = {0}; while(1){set = orgset; int nready = select(nfds+1, &set, NULL, NULL, NULL);if(nready < 0){perror("select err");exit(1);}if(FD_ISSET(lfd, &set)){int cfd = accept(lfd, (struct sockaddr*)&client_addr, &client_len); char ip[16] = {0};printf("conn from %s at %d\n",inet_ntop(AF_INET, &client_addr.sin_addr.s_addr, ip, sizeof(ip)),ntohs(client_addr.sin_port)); for(i = 0; i< FD_SETSIZE; i++) {if(client[i] < 0){client[i] = cfd; break; }}if(i == FD_SETSIZE) {printf("client too many\n");break; }FD_SET(cfd, &orgset); if(cfd > nfds) nfds = cfd; if(--nready == 0)continue; }for(i = 0; i < FD_SETSIZE ; i++) {if(client[i] < 0)continue; if(FD_ISSET(client[i], &set)) {int n = read(client[i], buf, sizeof(buf));if(n < 0){perror("read err");close(client[i]); FD_CLR(client[i],&orgset); client[i] = -1; }if(n == 0){printf("client[%d] closed\n", i);close(client[i]);FD_CLR(client[i],&orgset);client[i] = -1;}if(n > 0){write(client[i], buf, n);write(STDOUT_FILENO, buf, n);}if(--nready == 0)break; }}}close(lfd);return 0;
}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!