




已阅读5页,还剩8页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
网络编程作业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.data); FD_CLR(sockfd, &allset);clienti.fd = -1;free();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(f
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论