基于select和epoll的Echo服务器与客户端编程

来源:互联网 发布:用什么画网络拓扑图 编辑:程序博客网 时间:2024/05/19 19:43
epoll——sever
#include<stdio.h>#include<stdlib.h>#include<string.h>#include<sys/socket.h>#include<sys/types.h>#include<netinet/in.h>#include<arpa/inet.h>#include <sys/fcntl.h>#include <unistd.h>#include <errno.h> #include <sys/epoll.h>#define BACKLOG 20#define PORT 9876#define MAXDATASIZE 512ssize_t sock_send(int sockfd, const char* buffer, size_t buflen)   {       ssize_t tmp;       size_t total = buflen;       const char *p = buffer;       while(1)       {           tmp = send(sockfd, p, total, 0);           if(tmp < 0)           {                  if(errno == EINTR)                    continue;              if(errno == EAGAIN)               {                   usleep(1000);                   continue;               }               return -1;           }           if((size_t)tmp == total)               return buflen;           total -= tmp;           p += tmp;       }    return tmp;   }void setnonblocking(int sock)    {        int opts;        opts=fcntl(sock,F_GETFL);           if(opts<0)        {            perror("fcntl(sock,GETFL)");            exit(1);        }           opts = opts | O_NONBLOCK;           if(fcntl(sock,F_SETFL,opts)<0)        {            perror("fcntl(sock,SETFL,opts)");            exit(1);        }    }    int main(){char sendline[MAXDATASIZE];int listenfd,connfd,epfd,nfds;int maxfd;int client_len, server_len;int i;struct epoll_event ev,events[BACKLOG];struct sockaddr_in server_sockaddr;struct sockaddr_in client_sockaddr;epfd=epoll_create(256);listenfd=socket(AF_INET, SOCK_STREAM, 0); setnonblocking(listenfd);ev.data.fd=listenfd;ev.events=EPOLLIN|EPOLLET;epoll_ctl(epfd,EPOLL_CTL_ADD,listenfd,&ev);bzero(&server_sockaddr,sizeof(server_sockaddr));server_sockaddr.sin_family = AF_INET;server_sockaddr.sin_addr.s_addr = htonl(INADDR_ANY);server_sockaddr.sin_port = htons(PORT);server_len=sizeof(server_sockaddr);bind(listenfd,(struct sockaddr *)&server_sockaddr,server_len);listen(listenfd,BACKLOG);while(1){nfds=epoll_wait(epfd,events,BACKLOG,-1);for(i=0;i<nfds;i++){if(events[i].data.fd==listenfd){while((connfd=accept(listenfd,(struct sockaddr *)&client_sockaddr, &client_len))>0){setnonblocking(connfd);ev.data.fd=connfd;ev.events=EPOLLIN|EPOLLET;temp=epoll_ctl(epfd,EPOLL_CTL_ADD,connfd,&ev);}}else if(events[i].events & EPOLLIN){int sockfd;if((sockfd=events[i].data.fd)<0)                        continue;    memset(sendline, 0, MAXDATASIZE);     int len=0;    int n=0;    while((len=read(sockfd, sendline+n, MAXDATASIZE))>0)    {    n+=len;    }    if(len == -1 && errno != EAGAIN)                   {                      close(sockfd);                    events[i].data.fd = -1;                    }                 if(len == 0)                   {                       close(sockfd);                       continue;                  }   ev.data.fd=sockfd;                ev.events=EPOLLOUT | EPOLLET;                  epoll_ctl(epfd,EPOLL_CTL_MOD,sockfd,&ev); }else if(events[i].events & EPOLLOUT){int sockfd;if((sockfd=events[i].data.fd)<0)                        continue;    int len=sock_send(sockfd, sendine, strlen(sendline)+1);if (len<0) {printf("Send error\n");exit(1);}ev.data.fd=sockfd;                ev.events=EPOLLIN | EPOLLET;                  epoll_ctl(epfd,EPOLL_CTL_MOD,sockfd,&ev);} }}}

select——server

#include<stdio.h>#include<stdlib.h>#include<string.h>#include<sys/socket.h>#include<sys/types.h>#include<netinet/in.h>#include<arpa/inet.h>#include <sys/fcntl.h>#include <unistd.h>#define BACKLOG 5#define PORT 8888#define MAXDATASIZE 5000int main(){int rcd;int sockfd,connfd;int maxfd;int socklen, server_len;int i;int watch_fd_list[BACKLOG];struct sockaddr_in server_sockaddr;struct sockaddr_in cli_sockaddr;for (i = 0; i <= BACKLOG; i++)watch_fd_list[i] = -1;sockfd = socket(AF_INET, SOCK_STREAM, 0);if (sockfd == -1) {printf("socket error!\n");exit(1);}bzero(&server_sockaddr,sizeof(server_sockaddr));server_sockaddr.sin_family = AF_INET;server_sockaddr.sin_addr.s_addr = htonl(INADDR_ANY);server_sockaddr.sin_port = htons(PORT);server_len=sizeof(server_sockaddr);rcd=bind(sockfd,(struct sockaddr *)&server_sockaddr,server_len);if(rcd==-1){perror("Bind()error.");exit(1);}rcd=listen(sockfd,BACKLOG);if(rcd==-1){perror("listen() error\n");  exit(1); }maxfd = sockfd;fd_set watchset;FD_ZERO(&watchset);FD_SET(sockfd, &watchset);while(1){FD_ZERO(&watchset);FD_SET(sockfd, &watchset);for (i = 0; i <= BACKLOG; i++)if (watch_fd_list[i] != -1){FD_SET(watch_fd_list[i], &watchset);}rcd=select(maxfd + 1, &watchset, NULL, NULL, NULL);if(rcd==-1){printf("Select error\n");exit(1);}if(FD_ISSET(sockfd,&watchset)){socklen = sizeof(cli_sockaddr);connfd = accept(sockfd,(struct sockaddr *) &cli_sockaddr, &socklen);if (connfd < 0) {printf("Accept error\n");exit(1);}for (int i = 0; i <= BACKLOG; i++) {if (watch_fd_list[i] == -1) {watch_fd_list[i] = connfd;break;}}FD_SET(connfd, &watchset);if (maxfd < connfd)maxfd = connfd;}else{for(int i=0;i<=BACKLOG;i++){if(watch_fd_list[i]==-1)continue;if(!FD_ISSET(watch_fd_list[i],&watchset))continue;char buffer[MAXDATASIZE];int len=recv(watch_fd_list[i], buffer, MAXDATASIZE, 0);if(len<0){printf("Recv error\n");exit(1);}buffer[len] = '\0';len = send(watch_fd_list[i], buffer, strlen(buffer), 0);if (len < 0) {printf("Send error\n");exit(1);}shutdown(watch_fd_list[i],2);watch_fd_list[i] = -1;FD_CLR(watch_fd_list[i], &watchset);}}}}


client
#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <string.h>#include<sys/types.h>#include<sys/socket.h>#include<netinet/in.h>#include <netdb.h>#include <arpa/inet.h>#define MAXDATASIZE 5000#define PORT 8888void process( int sockfd);int main(){while(1){process();}}void process(){struct sockaddr_in seraddr;int sockfd = socket(AF_INET, SOCK_STREAM, 0);if (sockfd < 0) {printf("socket Error!");exit(0);}bzero(&seraddr,sizeof(seraddr));seraddr.sin_family = AF_INET;seraddr.sin_port = htons(PORT);seraddr.sin_addr.s_addr=inet_addr("127.0.0.1");if (connect(sockfd, (struct sockaddr *) &seraddr, sizeof(seraddr)) < 0) {printf("connect Error!!\n");exit(0);}char sendline[MAXDATASIZE],recvline[MAXDATASIZE];int num;scanf("%s",sendline);send(sockfd,sendline, strlen(sendline),0);if ((num =recv(sockfd, recvline, MAXDATASIZE,0)) == 0) {printf("Server terminated.\n");return;}recvline[num]='\0';printf("%s\n",recvline);close(sockfd);}




阅读全文
0 0
原创粉丝点击