作业社区
探索学习新天地,共享知识资源!
学无止境呀呀呀 的学生作业:
tcp_echo_server.c #include #include #include #include #include #include #include #include #define BACKLOG 10 int main(int argc,char *argv[]) { if(argc!=3) { fprintf(stderr,"usage : %s < ip > < port >.\n",argv[0]); exit(EXIT_FAILURE); } int sfd,ret,cfd; ssize_t rbytes = 0,sbytes = 0; char buffer[1024] = {0}; struct sockaddr_in svr_addr,cli_addr; socklen_t len = sizeof(struct sockaddr_in); sfd = socket(AF_INET,SOCK_STREAM,0); if(sfd == -1) { perror("[ERROR] socket():"); exit(EXIT_FAILURE); } //初始化服务端地址结构对象 bzero(&svr_addr,sizeof(struct sockaddr_in)); svr_addr.sin_family = AF_INET; svr_addr.sin_port = htons(atoi(argv[2])); svr_addr.sin_addr.s_addr = inet_addr(argv[1]); //绑定ip与端口号 ret = bind(sfd,(const struct sockaddr *)&svr_addr,sizeof(struct sockaddr_in)); if(ret == -1) { perror("[ERROR] bind():"); exit(EXIT_FAILURE); } ret = listen(sfd,BACKLOG); if(ret == -1) { perror("[ERROR] Failed to listen."); close(sfd); exit(EXIT_FAILURE); } printf("服务端启动成功,等待客户端连接....\n"); //接收客户端连接 cfd = accept(sfd,(struct sockaddr *)&cli_addr,&len); if(cfd == -1) { perror("[ERROR] Failed to accept."); close(sfd); exit(EXIT_FAILURE); } printf("ip : %s port :%d\n",inet_ntoa(cli_addr.sin_addr),ntohs(cli_addr.sin_port)); for(;;) { memset(buffer,0,sizeof(buffer)); //接收客户端消息 rbytes = recv(cfd,buffer,sizeof(buffer),0); if(rbytes == -1) { perror("[ERROR] Failed to recv."); close(cfd); close(sfd); exit(EXIT_FAILURE); }else if (rbytes>0) { //发回给客户端 sbytes = send(cfd,buffer,strlen(buffer),0); if(sbytes == -1) { perror("[ERROR] Failed to recv."); close(cfd); close(sfd); exit(EXIT_FAILURE); } }else if (rbytes == 0) { printf("客户端已断开连接"); break; } printf("客户端发来:%s",buffer); //回显给客户端 sbytes = send(cfd,buffer,strlen(buffer),0); if(sbytes == -1) { perror("[ERROR] send():"); close(cfd); close(sfd); exit(EXIT_FAILURE); } //收到quit 退出本次连接 if(strcmp(buffer,"quit\n") == 0) { printf("客户端请求退出,服务端结束本次连接\n"); break; } } //关闭套接字 close(cfd); close(sfd); return 0; } tcp_client.c #include #include #include #include #include #include #include #include int main(int argc,char *argv[]) { int sfd,ret; ssize_t sbytes = 0,rbytes = 0; char sbuffer[1024] = {0}; char rbuffer[1024] = {0}; struct sockaddr_in svr_addr; char buffer[1024] = {0}; if(argc != 3) { fprintf(stderr,"Usage : %s < ip > < port >.\n",argv[0]); return -1; } //创建套接字 sfd = socket(AF_INET,SOCK_STREAM,0); if(sfd == -1) { perror("[ERROR] socket():"); exit(EXIT_FAILURE); } printf("sfd = %d\n",sfd); //初始化服务器地址结构体 bzero(&svr_addr,sizeof(svr_addr)); svr_addr.sin_family = AF_INET; svr_addr.sin_port = htons(atoi(argv[2])); svr_addr.sin_addr.s_addr = inet_addr(argv[1]); //连接服务器 ret = connect(sfd,(const struct sockaddr *)&svr_addr,sizeof(svr_addr)); if(ret == -1) { perror("[ERROR] connect()"); close(sfd); exit(EXIT_FAILURE); } printf("已连接服务器\n"); while(1) { memset(sbuffer,0,sizeof(sbuffer)); memset(rbuffer,0,sizeof(rbuffer)); printf("请输入要发送的信息:"); if(fgets(sbuffer,sizeof(sbuffer),stdin) == NULL) { break; } //连同'\0'也发过去 strlen 当前字符串实际长度 sbytes = send(sfd,sbuffer,strlen(sbuffer)+1,0); if(sbytes == -1) { perror("[ERROR] send():"); close(sfd); exit(EXIT_FAILURE); } //接收服务端回显 rbytes = recv(sfd,rbuffer,sizeof(rbuffer),0); if(rbytes == -1) { perror("[ERROR] recv()"); close(sfd); exit(EXIT_FAILURE); }else if(rbytes == 0) { printf("服务端已端开连接\n"); break; } printf("服务端回显:%s",rbuffer); //输入quit后退出客户端 if(strcmp(sbuffer,"quit\n") == 0) { printf("客户端退出\n"); break; } } close(sfd); return 0; }
+64