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

作业社区

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

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

慕神4583458 的学生作业:

file.transfer.c #include "file_transfer.h" #include "debug.h" int recv_protocol_head(int cfd, file_protocol_t *p_head) { int total_size = sizeof(file_protocol_t); int total_recevied = 0; char *buf = (char *)p_head; ssize_t rbytes; for (;;) { rbytes = tcp_recv_pack(cfd, buf+ total_recevied, total_size - total_recevied); if (rbytes == -1) { DEBUG_INFO("[ERROR]: %s", strerror(errno)); return -1; } else if (rbytes == 0) { DEBUG_INFO("[INFO]: client is shutdown"); break; } else if (rbytes > 0) { total_recevied += rbytes; if (total_recevied >= total_size) break; } } if (total_recevied > total_size) { DEBUG_INFO("[INFO]: recevied failed"); return -1; } return 0; } int recv_filedata(int cfd,const char *filename,size_t targetsize) { int total_recevied = 0; ssize_t rbytes, wbytes; int fd = open(filename, O_RDWR | O_TRUNC | O_CREAT); if (fd == -1) { DEBUG_INFO("[INFO]: recevied failed"); return -1; } char buf[1024]; for(;;) { memset(buf, 0, sizeof(buf)); rbytes = recv(cfd, buf, sizeof(buf), 0); if (rbytes == -1) { DEBUG_INFO("[ERROR]: %s", strerror(errno)); return -1; } else if (rbytes == 0) { DEBUG_INFO("[INFO]: client is shutdown"); break; } else if (rbytes > 0) { wbytes = write(fd, buf, rbytes); if (rbytes != wbytes) { DEBUG_INFO("[INFO]: recevied fail"); return -1; } total_recevied += rbytes; if (total_recevied >= targetsize) break; } } if (total_recevied > targetsize) { DEBUG_INFO("[INFO]: recevied too large"); return -1; } close(fd); return total_recevied; } int client_upload_file(int cfd) { file_protocol_t file_protocol; int ret; ret = recv_protocol_head(cfd, &file_protocol); if (ret == -1) return -1; ret = recv_filedata(cfd, file_protocol.filename, file_protocol.filesize); if (ret == -1) return -1; printf("file recevied size = %d", ret); return 0; } int send_protocol_head(const char *filename,int sockfd) { file_protocol_t file_protocol; int fd = open(filename, O_RDONLY); if (fd == -1) { DEBUG_INFO("[ERROR]: %s", strerror(errno)); return -1; } int pos = lseek(fd, 0, SEEK_END); strcpy(file_protocol.filename, filename); file_protocol.filesize = pos; close(fd); int wbytes = tcp_send_pack(sockfd, &file_protocol, sizeof(file_protocol_t)); if (wbytes == -1) { DEBUG_INFO("[ERROR]: %s", strerror(errno)); return -1; } return pos; }

得分 100
学习任务

慕神4583458 的学生作业:

file_transfer.c #include "file_transfer.h" #include "debug.h" int recv_protocol_head(int cfd, file_protocol_t *p_head) { int total_size = sizeof(file_protocol_t); int total_recevied = 0; char *buf = (char *)p_head; ssize_t rbytes; for (;;) { rbytes = tcp_recv_pack(cfd, buf+ total_recevied, total_size - total_recevied); if (rbytes == -1) { DEBUG_INFO("[ERROR]: %s", strerror(errno)); return -1; } else if (rbytes == 0) { DEBUG_INFO("[INFO]: client is shutdown"); break; } else if (rbytes > 0) { total_recevied += rbytes; if (total_recevied >= total_size) break; } } if (total_recevied > total_size) { DEBUG_INFO("[INFO]: recevied failed"); return -1; } return 0; } int recv_filedata(int cfd,const char *filename,size_t targetsize) { int total_recevied = 0; ssize_t rbytes, wbytes; int fd = open(filename, O_RDWR | O_TRUNC | O_CREAT); if (fd == -1) { DEBUG_INFO("[INFO]: recevied failed"); return -1; } char buf[1024]; for(;;) { memset(buf, 0, sizeof(buf)); rbytes = recv(cfd, buf, sizeof(buf), 0); if (rbytes == -1) { DEBUG_INFO("[ERROR]: %s", strerror(errno)); return -1; } else if (rbytes == 0) { DEBUG_INFO("[INFO]: client is shutdown"); break; } else if (rbytes > 0) { wbytes = write(fd, buf, rbytes); if (rbytes != wbytes) { DEBUG_INFO("[INFO]: recevied fail"); return -1; } total_recevied += rbytes; if (total_recevied >= targetsize) break; } } if (total_recevied > targetsize) { DEBUG_INFO("[INFO]: recevied too large"); return -1; } close(fd); return total_recevied; } int client_upload_file(int cfd) { file_protocol_t file_protocol; int ret; ret = recv_protocol_head(cfd, &file_protocol); if (ret == -1) return -1; ret = recv_filedata(cfd, file_protocol.filename, file_protocol.filesize); if (ret == -1) return -1; printf("file recevied size = %d", ret); return 0; }

得分 100
学习任务

慕神4583458 的学生作业:

file.transfer.h #ifndef __FILE_TRANSFER_H__ #define __FILE_TRANSFER_H__ #include "tcpsocket.h" #include #include #include #define FILENAME_SZ 256 typedef struct file_protocol{ size_t filesize; // 文件大小 char filename[FILENAME_SZ]; // 文件名 }file_protocol_t; extern int recv_protocol_head(int cfd,file_protocol_t *p_head); extern int recv_filedata(int cfd,const char *filename,size_t targetsize); #endif file_transfer.c #include "file_transfer.h" #include "debug.h" int recv_protocol_head(int cfd, file_protocol_t *p_head) { int total_size = sizeof(file_protocol_t); int total_recevied = 0; char *buf = (char *)p_head; ssize_t rbytes; for (;;) { rbytes = recv(cfd, buf + total_recevied, total_size - total_recevied, 0); if (rbytes == -1) { DEBUG_INFO("[ERROR]: %s", strerror(errno)); return -1; } else if (rbytes == 0) { DEBUG_INFO("[INFO]: client is shutdown"); break; } else if (rbytes > 0) { total_recevied += rbytes; if (total_recevied >= total_size) break; } } if (total_recevied > total_size) { DEBUG_INFO("[INFO]: recevied failed"); return -1; } return 0; } int recv_filedata(int cfd,const char *filename,size_t targetsize) { int total_recevied = 0; ssize_t rbytes, wbytes; int fd = open(filename, O_RDWR | O_TRUNC | O_CREAT); if (fd == -1) { DEBUG_INFO("[INFO]: recevied failed"); return -1; } char buf[1024]; for(;;) { memset(buf, 0, sizeof(buf)); rbytes = recv(cfd, buf, sizeof(buf), 0); if (rbytes == -1) { DEBUG_INFO("[ERROR]: %s", strerror(errno)); return -1; } else if (rbytes == 0) { DEBUG_INFO("[INFO]: client is shutdown"); break; } else if (rbytes > 0) { wbytes = write(fd, buf, rbytes); if (rbytes != wbytes) { DEBUG_INFO("[INFO]: recevied fail"); return -1; } total_recevied += rbytes; if (total_recevied >= targetsize) break; } } if (total_recevied > targetsize) return -1; close(fd); return total_recevied; }

得分 100
学习任务

慕神4583458 的学生作业:

tcpsocket.h #ifndef __TCPSOCKET_H__ #define __TCPSOCKET_H__ #include /* See NOTES */ #include #include #include #include #include #include #include #include #include #define BACKLOG 20 extern int create_tcp_server_socket(const char *ip, unsigned short port); extern int create_tcp_client_socket(const char *svr_ip,const unsigned short svr_port); extern int wait_for_connect(int sfd,struct sockaddr_in *cli_addr); extern void show_tcp_network_address(struct sockaddr_in *sockaddr); extern ssize_t tcp_send_pack(int socketfd, void *buf, ssize_t len); extern ssize_t tcp_recv_pack(int socketfd, char *buf, ssize_t len); #endif tcpsocket.c #include "debug.h" #include "tcpsocket.h" int create_tcp_server_socket(const char *ip, unsigned short port) { int socketfd = socket(AF_INET, SOCK_STREAM, 0); struct sockaddr_in addr_in; if (socketfd == -1) { DEBUG_INFO("[ERROR]: %s", strerror(errno)); return -1; } addr_in.sin_family = AF_INET; addr_in.sin_port = htons(port); addr_in.sin_addr.s_addr = inet_addr(ip); int ret = bind(socketfd, (struct sockaddr *)&addr_in, sizeof(addr_in)); if (ret == -1) { DEBUG_INFO("[ERROR]: %s", strerror(errno)); return -1; } ret = listen(socketfd, BACKLOG); if (ret == -1) { DEBUG_INFO("[ERROR]: %s", strerror(errno)); return -1; } return socketfd; } int create_tcp_client_socket(const char *svr_ip,const unsigned short svr_port) { int socketfd = socket(AF_INET, SOCK_STREAM, 0); if (socketfd == -1) { DEBUG_INFO("[ERROR]: %s", strerror(errno)); return -1; } struct sockaddr_in addr_in; addr_in.sin_family = AF_INET; addr_in.sin_port = htons(svr_port); addr_in.sin_addr.s_addr = inet_addr(svr_ip); int ret = connect(socketfd, (struct sockaddr *)&addr_in, sizeof(addr_in)); if (ret == -1) { DEBUG_INFO("[ERROR]: %s", strerror(errno)); return -1; } DEBUG_INFO("[INFO]: Connect %s success\n", svr_ip); return socketfd; } int wait_for_connect(int sfd,struct sockaddr_in *cli_addr) { socklen_t len = sizeof(struct sockaddr_in); int cfd = accept(sfd, (void *)cli_addr, &len); if (cfd == -1) { DEBUG_INFO("[ERROR]: %s", strerror(errno)); return -1; } return cfd; } void show_tcp_network_address(struct sockaddr_in *sockaddr) { printf("ip = %s port = %d\n", inet_ntoa(sockaddr->sin_addr), ntohs(sockaddr->sin_port)); } ssize_t tcp_send_pack(int socketfd, void *buf, ssize_t len) { return send(socketfd, (void *)&buf, len, 0); } ssize_t tcp_recv_pack(int socketfd, char *buf, ssize_t len) { return recv(socketfd, &buf, len, 0); } client.c #include "tcpsocket.h" int main(int argc, char *argv[]) { if (argc != 3) { fprintf(stderr, " %s ip port", argv[0]); return -1; } int socketfd; socketfd = create_tcp_client_socket(argv[1], atoi(argv[2])); if (socketfd == -1) return -1; close(socketfd); } server.c #include "tcpsocket.h" int main(int argc, char *argv[]) { if (argc != 3) { fprintf(stderr, " %s ip port", argv[0]); return -1; } int socketfd; socketfd = create_tcp_server_socket(argv[1], atoi(argv[2])); if (socketfd == -1) return -1; struct sockaddr_in cli_addr; int cfd; bzero(&cli_addr,sizeof(struct sockaddr_in)); cfd = wait_for_connect(socketfd, &cli_addr); if (cfd == -1) return -1; show_tcp_network_address(&cli_addr); close(socketfd); close(cfd); return 0; }

得分 100
学习任务

慕神4583458 的学生作业:

tcp_socket.h #ifndef __TCPSOCKET_H__ #define __TCPSOCKET_H__ #include /* See NOTES */ #include #include #include #include #include #include #include #include #include #define BACKLOG 20 extern int create_tcp_server_socket(const char *ip, unsigned short port); extern int create_tcp_client_socket(const char *svr_ip,const unsigned short svr_port); extern int wait_for_connect(int sfd,struct sockaddr_in *cli_addr); extern void show_tcp_network_address(struct sockaddr_in *sockaddr); extern ssize_t tcp_send_pack(int socketfd, char *buf, ssize_t len); extern ssize_t tcp_recv_pack(int socketfd, char *buf, ssize_t len); #endif tpc_socket.c #include "debug.h" #include "tcpsocket.h" int create_tcp_server_socket(const char *ip, unsigned short port) { int socketfd = socket(AF_INET, SOCK_STREAM, 0); struct sockaddr_in addr_in; if (socketfd == -1) { DEBUG_INFO("[ERROR]: %s", strerror(errno)); return -1; } addr_in.sin_family = AF_INET; addr_in.sin_port = htons(port); addr_in.sin_addr.s_addr = inet_addr(ip); int ret = bind(socketfd, (struct sockaddr *)&addr_in, sizeof(addr_in)); if (ret == -1) { DEBUG_INFO("[ERROR]: %s", strerror(errno)); return -1; } ret = listen(socketfd, BACKLOG); if (ret == -1) { DEBUG_INFO("[ERROR]: %s", strerror(errno)); return -1; } return socketfd; } int create_tcp_client_socket(const char *svr_ip,const unsigned short svr_port) { int socketfd = socket(AF_INET, SOCK_STREAM, 0); if (socketfd == -1) { DEBUG_INFO("[ERROR]: %s", strerror(errno)); return -1; } struct sockaddr_in addr_in; addr_in.sin_family = AF_INET; addr_in.sin_port = htons(svr_port); addr_in.sin_addr.s_addr = inet_addr(svr_ip); int ret = connect(socketfd, (struct sockaddr *)&addr_in, sizeof(addr_in)); if (ret == -1) { DEBUG_INFO("[ERROR]: %s", strerror(errno)); return -1; } DEBUG_INFO("[INFO]: Connect %s success\n", svr_ip); return socketfd; } int wait_for_connect(int sfd,struct sockaddr_in *cli_addr) { socklen_t len; int cfd = accept(sfd, (void *)&cli_addr, &len); if (cfd == -1) { DEBUG_INFO("[ERROR]: %s", strerror(errno)); return -1; } return cfd; } void show_tcp_network_address(struct sockaddr_in *sockaddr) { printf("ip = %s port = %d", inet_ntoa(sockaddr->sin_addr), ntohs(sockaddr->sin_port)); } ssize_t tcp_send_pack(int socketfd, char *buf, ssize_t len) { return send(socketfd, (void *)&buf, len, 0); } ssize_t tcp_recv_pack(int socketfd, char *buf, ssize_t len) { return recv(socketfd, &buf, len, 0); }

得分 100
学习任务

慕神4583458 的学生作业:

#include "debug.h" #include "tcpsocket.h" int create_tcp_server_socket(const char *ip, unsigned short port) { int socketfd = socket(AF_INET, SOCK_STREAM, 0); struct sockaddr_in addr_in; if (socketfd == -1) { DEBUG_INFO("[ERROR]: %s", strerror(errno)); return -1; } addr_in.sin_family = AF_INET; addr_in.sin_port = htons(port); addr_in.sin_addr.s_addr = inet_addr(ip); int ret = bind(socketfd, (struct sockaddr *)&addr_in, sizeof(addr_in)); if (ret == -1) { DEBUG_INFO("[ERROR]: %s", strerror(errno)); return -1; } ret = listen(socketfd, BACKLOG); if (ret == -1) { DEBUG_INFO("[ERROR]: %s", strerror(errno)); return -1; } return socketfd; } int create_tcp_client_socket(const char *svr_ip,const unsigned short svr_port) { int socketfd = socket(AF_INET, SOCK_STREAM, 0); if (socketfd == -1) { DEBUG_INFO("[ERROR]: %s", strerror(errno)); return -1; } struct sockaddr_in addr_in; addr_in.sin_family = AF_INET; addr_in.sin_port = htons(svr_port); addr_in.sin_addr.s_addr = inet_addr(svr_ip); int ret = connect(socketfd, (struct sockaddr *)&addr_in, sizeof(addr_in)); if (ret == -1) { DEBUG_INFO("[ERROR]: %s", strerror(errno)); return -1; } DEBUG_INFO("[INFO]: Connect %s success\n", svr_ip); return socketfd; } int wait_for_connect(int sfd,struct sockaddr_in *cli_addr) { socklen_t len; int cfd = accept(sfd, (void *)&cli_addr, &len); if (cfd == -1) { DEBUG_INFO("[ERROR]: %s", strerror(errno)); return -1; } return cfd; }

得分 100
学习任务

慕神4583458 的学生作业:

【图片】 #include /* See NOTES */ #include #include #include #include #include #include #include #include #include #define BACKLOG 100 void *do_client(void *arg) { char read_buf[1024]; ssize_t rsize; ssize_t wsize; int socketfd = *(int *)arg; while(1) { memset(read_buf, 0, sizeof(read_buf)); rsize = recv(socketfd, read_buf, sizeof(read_buf), 0); if (rsize < 0) { perror("recv():"); } else if (rsize > 0) { if (strcmp(read_buf, "quit") == 0) { printf("quit exit\n"); break; } printf("recv=%s\n", read_buf); wsize = send(socketfd, read_buf, strlen(read_buf), 0); if (wsize == -1) { perror("send():"); } } else if (rsize == 0) { printf("client exit\n"); break; } } pthread_exit(NULL); } int main(int argc, char *argv[]) { if (argc != 3) { fprintf(stderr, " %s ip port", argv[0]); exit(EXIT_FAILURE); } int socketfd = socket(AF_INET, SOCK_STREAM, 0); if (socketfd == -1) { perror("socket():"); exit(EXIT_FAILURE); } struct sockaddr_in addr_in; addr_in.sin_family = AF_INET; addr_in.sin_port = htons(atoi(argv[2])); addr_in.sin_addr.s_addr = inet_addr(argv[1]); int ret = bind(socketfd, (struct sockaddr *)&addr_in, sizeof(addr_in)); if (ret == -1) { fprintf(stderr, "Bind error\n"); } ret = listen(socketfd, BACKLOG); if (ret == -1) { perror("listen():"); exit(EXIT_FAILURE); } struct sockaddr_in recvaddr_in; socklen_t len; for(;;) { int newsocketfd = accept(socketfd, (void *)&recvaddr_in, &len); if (ret == -1) { perror("accpet():"); exit(EXIT_FAILURE); } printf("source ip = %s port = %d\n", inet_ntoa(recvaddr_in.sin_addr), ntohs(recvaddr_in.sin_port)); pthread_t tid; int err = pthread_create(&tid, NULL, do_client, (void *)&newsocketfd); pthread_detach(tid); if (err != 0) { fprintf(stderr, "tid=%ld error:%s", tid, strerror(tid)); } } close(socketfd); return 0; }

得分 100
学习任务

慕神4583458 的学生作业:

server.c #include /* See NOTES */ #include #include #include #include #include #include #include #include #define BACKLOG 100 int main(int argc, char *argv[]) { if (argc != 3) { fprintf(stderr, " %s ip port", argv[0]); exit(EXIT_FAILURE); } int socketfd = socket(AF_INET, SOCK_STREAM, 0); if (socketfd == -1) { perror("socket():"); exit(EXIT_FAILURE); } struct sockaddr_in addr_in; addr_in.sin_family = AF_INET; addr_in.sin_port = htons(atoi(argv[2])); addr_in.sin_addr.s_addr = inet_addr(argv[1]); int ret = bind(socketfd, (struct sockaddr *)&addr_in, sizeof(addr_in)); if (ret == -1) { fprintf(stderr, "Bind error\n"); } ret = listen(socketfd, BACKLOG); if (ret == -1) { perror("listen():"); exit(EXIT_FAILURE); } struct sockaddr_in recvaddr_in; socklen_t len; int newsocketfd = accept(socketfd, (void *)&recvaddr_in, &len); if (ret == -1) { perror("accpet():"); exit(EXIT_FAILURE); } printf("source ip = %s port = %d\n", inet_ntoa(recvaddr_in.sin_addr), ntohs(recvaddr_in.sin_port)); char read_buf[1024]; ssize_t rsize; ssize_t wsize; while(1) { int total_size = 0; int read_len = 0; memset(read_buf, 0, sizeof(read_buf)); rsize = recv(newsocketfd, &read_len, 4, 0); if (rsize < 0) { perror("recv():"); } else if (rsize > 0) { printf("len=%d\n", read_len); } else if (rsize == 0) { printf("client exit\n"); break; } for(;;) { rsize = recv(newsocketfd, read_buf + total_size, read_len - total_size, 0); if (rsize < 0) { perror("recv():"); } else if (rsize == 0) { printf("client exit\n"); break; } else { total_size += rsize; if (total_size == read_len) break; } printf("size = %d buf = %s\n", (int)rsize, read_buf); } printf("recv=%s\n", read_buf); sleep(1); } close(socketfd); close(newsocketfd); return 0; } client.c #include /* See NOTES */ #include #include #include #include #include #include #include #include #include int main(int argc, char *argv[]) { if (argc != 3) { fprintf(stderr, " %s ip port", argv[0]); exit(EXIT_FAILURE); } int socketfd = socket(AF_INET, SOCK_STREAM, 0); if (socketfd == -1) { perror("socket():"); exit(EXIT_FAILURE); } struct sockaddr_in addr_in; addr_in.sin_family = AF_INET; addr_in.sin_port = htons(atoi(argv[2])); addr_in.sin_addr.s_addr = inet_addr(argv[1]); int ret = connect(socketfd, (struct sockaddr *)&addr_in, sizeof(addr_in)); if (ret == -1) { perror("connet():"); close(socketfd); return -1; } char w_buf[1024]; strcpy(w_buf, "Hello world test 123123123"); ssize_t rsize; int i = 0; int len = strlen(w_buf); while (1) { char *send_buf = (char *)malloc(len + 4); memcpy(send_buf, &len, 4); memcpy(send_buf + 4, w_buf, len); rsize = send(socketfd, send_buf, len + 4, 0); if (rsize == -1) { perror("recv():"); break; } else if (rsize == 0) { break; } usleep(100); } close(socketfd); return 0; }

微信客服

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

帮助反馈 APP下载

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

公众号

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