电子科技大学网络编程作业(IO复用).doc

上传人:xin****828 文档编号:6707168 上传时间:2020-03-02 格式:DOC 页数:13 大小:276.50KB
返回 下载 相关 举报
电子科技大学网络编程作业(IO复用).doc_第1页
第1页 / 共13页
电子科技大学网络编程作业(IO复用).doc_第2页
第2页 / 共13页
电子科技大学网络编程作业(IO复用).doc_第3页
第3页 / 共13页
点击查看更多>>
资源描述
网络编程作业4作业要求:服务器利用I/O复用技术,实现同时向多个客户提供服务。要求:服务器:接收客户连接请求,并打印客户IP地址及端口号,然后接收客户发来的字符串,并打印该字符串和其来自与哪个客户。同时向客户返回该字符串。当某一客户断开连接时,要求服务器打印该客户输入的所有字符。客户:从命令行接收服务器地址,并向服务器发起连接请求,连接成功后,从标准输入接收字符串并发送给服务器,等待服务器响应并打印接收的信息。程序:服务器端:#include #include #include #include #include #include #include #include #include #define PORT 9999#define BACKLOG5#define MAXDATASIZE1000typedef struct CLIENT int fd;char*name;structsockaddr_in addr;char*data;CLIENT;void process_cli(struct CLIENT *client, char *recvbuf, int len);void savedata(char *recvbuf, int len, char *data);int main(void) int i, maxi, maxfd, sockfd;int nready;ssize_t n;fd_set rset, allset;int listenfd, connectfd;struct sockaddr_in server;struct CLIENT clientFD_SETSIZE;char recvbufMAXDATASIZE;int sin_size;if(listenfd=socket(AF_INET, SOCK_STREAM, 0)=-1)perror(Create socket failed.);exit(-1);int opt = SO_REUSEADDR;setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt);bzero(&server, sizeof(server);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);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+)clienti.fd = -1;FD_ZERO(&allset);FD_SET(listenfd, &allset);while (1) struct sockaddr_in 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 (clienti.fd maxfd) maxfd = connectfd;if (i maxi) maxi =i;if (-nready =0 ) continue; for (i = 0; i = maxi; i+) if (sockfd = clienti.fd) 0) continue;if (FD_ISSET(sockfd, &rset) if ( n = recv(sockfd, recvbuf, MAXDATASIZE, 0) =0) close(sockfd);printf(Client (%s) closed connection. Users data: %sn, clienti.name, clienti.data); FD_CLR(sockfd, &allset);clienti.fd = -1;free(clienti.name);free(clienti.data); else process_cli(&clienti, recvbuf, n);if ( -nready name) = 0) memcpy(client-name,recvbuf, len); printf(Clientsname is %s.n,client-name); return; printf(Receivedclient( %s ) message: %sn,client-name, recvbuf); savedata(recvbuf,len,client-data); for (i1 = 0; i1fd,sendbuf,strlen(sendbuf),0);void savedata(char *recvbuf, int len, char *data) int start =strlen(data); int i; for (i = 0; i len; i+) datastart + i= recvbufi; 客户端:#include #include #include #include #include #include #include #define PORT 9999#define MAXDATASIZE100int main(int argc, char *argv)int fd, numbytes;char bufMAXDATASIZE;struct hostent * he;struct sockaddr_in server; int i=1;if (argc != 2)printf(Usage: %s n, argv0);exit(-1); if (he = gethostbyname(argv1) = NULL) perror(gethostbyname error.); exit(-1); if (fd = socket(AF_INET, SOCK_STREAM, 0) = -1) perror(Create socket failed.);exit(1);bzero(&server, sizeof(server);server.sin_family = AF_INET;server.sin_port = htons(PORT);server.sin_addr = *(struct in_addr *) he-h_addr);if (i=connect(fd, (struct sockaddr *)&server, sizeof(struct sockaddr) = -1) perror(connect failed.);exit(1);if( (numbytes = recv(fd, buf, MAXDATASIZE, 0) = -1) perror(recv error.);exit(1);bufnumbytes = 0;printf(Server Message: %s,buf); printf(Please input your name:); scanf(%s,buf); if( (numbytes = send(fd, buf, strlen(buf), 0) = -1) perror(send error.);exit(1); while(1) printf(Please input message(max char:%d):,MAXDATASIZE); scanf(%s,buf); if(strlen(buf)1) i=0; if( (numbytes = send(fd, buf, strlen(buf), 0) = -1) perror(send error.);exit(1); if( (numbytes = recv(fd, buf, MAXDATASIZE, 0) = -1) perror(read error.);exit(1); bufnumbytes = 0; close(fd);实验结果:服务器:客户端1:客户端2:
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 中学资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!