基于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
- 基于select和epoll的Echo服务器与客户端编程
- 基于linux下的epoll服务端和客户端编程实例
- CSAPP echo 客户端和服务器的示例
- Nginx 服务器 select 和epoll的区别
- Nginx 服务器 select 和epoll的区别
- Nginx 服务器 select 和epoll的区别
- UNIX网络编程----多线程echo服务器与客户端
- select 和 epoll的编程实现区别
- 深入理解计算机系统中网络编程一节echo客户端服务器的源码编译和运行
- 用epoll实现异步的Echo服务器
- 基于select模型的tcp服务器---一个服务器如何与多个客户端进行通信?
- Unix网络编程学习日记(五):基于epoll与管道的socket客户端
- 基于HTTP的客户端与服务器交互编程
- 简单的echo服务器与客户端的实现
- Linux网络编程--多线程实现echo服务器与客户端“一对多”功能,网络编程的“Hello World!” - 壮壮熊
- 网络编程- 客户端(select) 服务端 epoll
- socket实现简单的echo应答服务器和客户端
- unix网络编程----迭代式echo服务器与客户端(只支持一个客户端通信)
- 【配置】vs13+opencv2.4.9+cuda6.5+64位win7编译配置
- PHP学习笔记2(变量)
- 下载APK后打开APK,在安装时的报错 android.os.FileUriExposedException:exposed beyond app through Intent.getData()
- 阿里云发布首款全球智能互联的网络产品——云骨干网
- mac下更新 .bash_profile文件
- 基于select和epoll的Echo服务器与客户端编程
- 单链表的实现(增、删、查、改功能)
- mysql中创建数据表
- html基础知识(一) ---- div、span、labelq区别
- vue-cli 接口代理配置
- Python3 初学实践案例(4)可设定长度和密码复杂级别的生成密码脚本
- Tum_ardrone学习相关1
- matplotlib的配置参数rcParams
- java异常分类和解析