为了账号安全,请及时绑定邮箱和手机立即绑定

作业社区

探索学习新天地,共享知识资源!

0 提交作业
0 布置作业
0 满分作业
得分 100
学习任务

北城半夏4806197 的学生作业:

#include #include #include #include #include /* See NOTES */ #include #include #include #include #include #include #define BACKLOG 10 //listen长度 void do_sigchld_handler(int sig) { wait(NULL);// 当子进程退出时,调用 wait 函数释放空间 } void *do_process(void *arg) { ssize_t rbytes = 0,sbytes=0; char buffer[1024] = {0}; int cfd = *(int *)arg; //从客户端发送数据 memset(buffer,0,sizeof(buffer)); rbytes = recv(cfd,buffer,sizeof(buffer),0); if(rbytes == -1) { perror("[ERROR] recv():"); pthread_exit(NULL); } else if(rbytes == 0) { printf("The server hsa been shut down.\n"); pthread_exit(NULL); } else if(rbytes > 0) { sbytes = send(cfd,buffer,sizeof(buffer),0); if(sbytes == -1) { perror("[ERROR] send():"); pthread_exit(NULL); } } pthread_exit(NULL); } int main(int argc, char const *argv[]) { int sfd,ret,cfd; int optval = 1; struct sockaddr_in svr_addr,cli_addr; socklen_t len = sizeof(struct sockaddr_in); ssize_t rbytes = 0,sbytes=0; char buffer[1024] = {0}; pid_t cpid; pthread_t tid; __sighandler_t retsig; retsig = signal(SIGCHLD,do_sigchld_handler); if (retsig == SIG_ERR){ perror("[ERROR] signal(): "); exit(EXIT_FAILURE); } if(argc < 3) { fprintf(stderr,"Usage : %s ip port!\n",argv[0]); exit(EXIT_FAILURE); } sfd = socket(AF_INET,SOCK_STREAM,0); if(sfd == -1) { perror("[ERROR] socket():"); exit(EXIT_FAILURE); } 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 = htonl(INADDR_ANY); //绑定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] listen():"); exit(EXIT_FAILURE); } for(;;) { //建立连接,并产生新的客户端套接字cfd用于数据收发 cfd = accept(sfd,(struct sockaddr *)&cli_addr,&len); if(cfd == -1) { perror("[ERROR] accept():"); exit(EXIT_FAILURE); } printf("ip : %s , port : %d\n",inet_ntoa(cli_addr.sin_addr),ntohs(cli_addr.sin_port)); ret = pthread_create(&tid,NULL,do_process,(void *)&cfd); if(ret != 0) { fprintf(stderr,"[ERROE] pthread_create( ):%s\n",strerror(ret)); exit(EXIT_FAILURE); } pthread_detach(tid); } return 0; } 【图片】

得分 100
学习任务

北城半夏4806197 的学生作业:

#include #include #include #include #include /* See NOTES */ #include #include #include #define LISTEN_SZ 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; struct sockaddr_in svr_addr,cli_addr; int length; int receve_total; ssize_t sbytes,rbytes; char buffer[1024] = {0}; 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]); ret = bind(sfd,(const struct sockaddr *)&svr_addr,sizeof(struct sockaddr_in)); if (ret == -1){ perror("[ERROR] bind(): "); close(sfd); exit(EXIT_FAILURE); } ret = listen(sfd,LISTEN_SZ); if (ret == -1){ perror("[ERROR] listen(): "); close(sfd); exit(EXIT_FAILURE); } socklen_t len = sizeof(struct sockaddr_in); bzero(&cli_addr,sizeof(struct sockaddr)); cfd = accept(sfd,(struct sockaddr *)&cli_addr,&len); if (cfd == -1){ perror("[ERROR] accept(): "); exit(EXIT_FAILURE); } printf("ip : %s,port : %d\n",inet_ntoa(cli_addr.sin_addr),ntohs(cli_addr.sin_port)); for(;;){ length = 0; receve_total = 0; //接收数据的长度 rbytes = recv(cfd,&length,4,0); if (rbytes == -1){ perror("[ERROR] Failed to recv."); exit(EXIT_FAILURE); } for(;;){ rbytes = recv(cfd,buffer + receve_total,length - receve_total,0); if (rbytes == -1){ perror("[ERROR] Failed to recv."); exit(EXIT_FAILURE); }else if (rbytes == 0){ printf("The client has been shutdown.\n"); }else if (rbytes > 0){ receve_total += rbytes; if (receve_total == length) break; } } printf("buffer : %s\n",buffer); sleep(1); } close(sfd); return 0; } #include #include #include #include #include #include #include /* See NOTES */ #include int main(int argc,char *argv[]) { int sfd,ret; ssize_t sbytes = 0,rbytes = 0; socklen_t length; char sbuffer[1024] = "hello,world"; char *pbuffer = NULL; struct sockaddr_in svr_addr; 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(struct sockaddr)); if (ret == -1){ perror("[ERROR] connect():"); exit(EXIT_FAILURE); } for(;;){ length = strlen(sbuffer); // 计算发送数据的长度 pbuffer = (char *)malloc(length + 4); // 分配空间,包含长度空间 与数据空间 memcpy(pbuffer,&length,4); //拷贝长度到缓冲区中 memcpy(pbuffer + 4,sbuffer,length); // 拷贝数据到缓冲区中 sbytes = send(sfd,pbuffer,length + 4,0); // 发送数据给服务器 if (ret == -1){ perror("[ERROR] Failed to send."); exit(EXIT_FAILURE); } usleep(100); } close(sfd); return 0; } 【图片】

得分 100
学习任务

北城半夏4806197 的学生作业:

主要原因是 TCP 协议在底层是字节流,并不关注,应用层的消息边界。 #include #include #include #include #include /* See NOTES */ #include #include #include #define LISTEN_SZ 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; struct sockaddr_in svr_addr,cli_addr; ssize_t sbytes,rbytes; char buffer[1024] = {0}; 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]); ret = bind(sfd,(const struct sockaddr *)&svr_addr,sizeof(struct sockaddr_in)); if (ret == -1){ perror("[ERROR] bind(): "); close(sfd); exit(EXIT_FAILURE); } ret = listen(sfd,LISTEN_SZ); if (ret == -1){ perror("[ERROR] listen(): "); close(sfd); exit(EXIT_FAILURE); } socklen_t len = sizeof(struct sockaddr_in); bzero(&cli_addr,sizeof(struct sockaddr)); cfd = accept(sfd,(struct sockaddr *)&cli_addr,&len); if (cfd == -1){ perror("[ERROR] accept(): "); exit(EXIT_FAILURE); } printf("ip : %s,port : %d\n",inet_ntoa(cli_addr.sin_addr),ntohs(cli_addr.sin_port)); for(;;) { memset(buffer,sizeof(buffer),0); rbytes = recv(cfd,buffer,sizeof(buffer),0); if (rbytes == -1){ perror("recv(): "); exit(EXIT_FAILURE); }else if (rbytes == 0){ printf("The client is offline.\n"); exit(EXIT_FAILURE); }else if (rbytes > 0){ printf(" %s\n",buffer); } sleep(1);// 服务器间隔 1s 接收一次数据 } close(cfd); close(sfd); return 0; } #include #include #include #include #include #include #include /* See NOTES */ #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; 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(struct sockaddr)); if (ret == -1){ perror("[ERROR] connect():"); exit(EXIT_FAILURE); } for(;;){ strcpy(sbuffer,"hello,abcde"); sbytes = send (sfd,sbuffer,strlen(sbuffer),0); if (sbytes == -1){ perror("[ERROR] send(): "); exit(EXIT_FAILURE); } usleep(100); } close(sfd); return 0; } 【图片】

微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号