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

作业社区

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

0 提交作业
0 布置作业
0 满分作业
得分 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; }

得分 100
学习任务

慕神4583458 的学生作业:

tcp粘包的原因,一个是有可能传输的数据大小小于缓冲区的大小,一个是传输的数据超过了最大传输单元 另外一个原因是,服务器接收的速度小于客户端发送的速度 代码 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) { memset(read_buf, 0, sizeof(read_buf)); rsize = recv(newsocketfd, read_buf, sizeof(read_buf), 0); if (rsize < 0) { perror("recv():"); } else if (rsize > 0) { printf("recv=%s\n", read_buf); } else if (rsize == 0) { printf("client exit\n"); break; } 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"); ssize_t rsize; int i = 0; while (1) { rsize = send(socketfd, w_buf, strlen(w_buf), 0); if (rsize == -1) { perror("recv():"); break; } else if (rsize == 0) { break; } } 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) { memset(read_buf, 0, sizeof(read_buf)); rsize = recv(newsocketfd, 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(newsocketfd, read_buf, strlen(read_buf), 0); if (wsize == -1) { perror("send():"); } } else if (rsize == 0) { printf("client exit\n"); break; } } 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; } pid_t pid = fork(); if (pid == 0) { char read_buf[1024]; ssize_t rsize; while(1) { bzero(read_buf,sizeof(read_buf)); rsize = recv(socketfd, read_buf, sizeof(read_buf), 0); if (rsize == -1) { perror("recv():"); break; } else if (rsize == 0) { break; } printf("%s\n", read_buf); } close(socketfd); exit(EXIT_FAILURE); } char buf[1024]; ssize_t sz; while(1) { bzero(buf, sizeof(buf)); putchar('>'); fgets(buf, sizeof(buf), stdin); buf[strlen(buf) - 1] = '\0'; if (strcmp(buf, "quit") == 0) break; sz = send(socketfd, buf, strlen(buf), 0); } close(socketfd); wait(NULL); return 0; }

微信客服

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

帮助反馈 APP下载

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

公众号

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