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

作业社区

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

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

大禹123 的学生作业:

debug.h #ifndef _DEBUG_H_ #define _DEBUG_H_ /* __FILE__:输出文件名 __FUNCTION__:输出函数名 __LINE__:输出行号 }while:括号要与while连接在一起 */ #define DEBUG_INFO(args...) do{ \ char b__[1024];\ sprintf(b__,args);\ fprintf(stderr,"[%s,%s,%d] : %s", __FILE__ , __FUNCTION__ ,__LINE__ ,b__); \ }while(0) #endif tcp_socket.h #ifndef __TCP_SOCKET_H_ #define __TCP_SOCKET_H_ #include #include #include #include /* See NOTES */ #include #include #include #include // 创建并初始化 tcp 服务器 socket extern int create_tcp_server_socket(const char *ip,unsigned short port); // 用于创建tcp客户端连接 extern int create_tcp_client_socket(const char *server_ip,unsigned short server_port); //等待与客户端连接 extern int wait_for_connect(int sockfd, struct sockaddr_in* client_addr); //显示连接客户端的地址信息 extern void show_tcp_network_addr(struct sockaddr_in *sockaddr); //发送数据 extern ssize_t tcp_send_pack(int sockfd, const void *buf, size_t len); //接收数据 extern ssize_t tcp_recv_pack(int sockfd, void *buf, size_t len); #endif tcp_socket.c #include "tcp_socket.h" #include "debug.h" #define BACKLOG 10 int create_tcp_server_socket(const char *ip,unsigned short port) { int sfd; int ret; struct sockaddr_in server_addr; socklen_t len = sizeof(struct sockaddr_in); //1、创建套接字 sfd = socket(AF_INET, SOCK_STREAM, 0); if(sfd == -1) { DEBUG_INFO("[ERROR] socket:%s\n", strerror(errno)); return -1; } bzero(&server_addr, len); //地址族/协议族 与socket函数第一个参数相同 server_addr.sin_family = AF_INET; server_addr.sin_port = htons(port); server_addr.sin_addr.s_addr = inet_addr(ip); //2、绑定ip,端口号 ret = bind(sfd, (const struct sockaddr *) &server_addr, len); if(ret == -1) { DEBUG_INFO("[ERROR] bind():%s\n", strerror(errno)); return -1; } //3、设置套接字为监听状态,建立监听队列,如果服务端处理不过来的话,会把客户端连接请求缓存在监听队列里,如果超过最大队列数量,那么会被拒绝连接 ret = listen(sfd, BACKLOG); if(ret == -1) { DEBUG_INFO("[ERROR] listen():%s\n", strerror(errno)); return -1; } return sfd; } int create_tcp_client_socket(const char *server_ip,unsigned short server_port) { int sfd; int ret; struct sockaddr_in server_addr; //1、创建套接字 sfd = socket(AF_INET, SOCK_STREAM, 0); if(sfd == -1) { DEBUG_INFO("[ERROR] socket():%s\n", strerror(errno)); return -1; } bzero(&server_addr, sizeof(struct sockaddr_in)); //地址族/协议族 与socket函数第一个参数相同 server_addr.sin_family = AF_INET; server_addr.sin_port = htons(server_port); server_addr.sin_addr.s_addr = inet_addr(server_ip); ret = connect(sfd, (const struct sockaddr *) &server_addr, sizeof(struct sockaddr_in)); if(ret == -1) { DEBUG_INFO("[ERROR] connect():%s\n", strerror(errno)); return -1; } return sfd; } int wait_for_connect(int sockfd, struct sockaddr_in* client_addr) { int cfd; socklen_t len = sizeof(struct sockaddr_in); cfd = accept(sockfd, (struct sockaddr *)client_addr, &len); if(cfd == -1) { DEBUG_INFO("[ERROR] accept():%s\n", strerror(errno)); return -1; } return cfd; } void show_tcp_network_addr(struct sockaddr_in *sockaddr) { printf("ip:%s prot:%d\n",inet_ntoa(sockaddr->sin_addr), ntohs(sockaddr->sin_port)); } //发送数据 ssize_t tcp_send_pack(int sockfd, const void *buf, size_t len) { return send(sockfd, buf, len, 0); } //接收数据 ssize_t tcp_recv_pack(int sockfd, void *buf, size_t len) { return recv(sockfd, buf, len, 0); }

得分 100
学习任务

大禹123 的学生作业:

debug.h #ifndef _DEBUG_H_ #define _DEBUG_H_ /* __FILE__:输出文件名 __FUNCTION__:输出函数名 __LINE__:输出行号 }while:括号要与while连接在一起 */ #define DEBUG_INFO(args...) do{ \ char b__[1024];\ sprintf(b__,args);\ fprintf(stderr,"[%s,%s,%d] : %s", __FILE__ , __FUNCTION__ ,__LINE__ ,b__); \ }while(0) #endif tcp_socket.h #ifndef __TCP_SOCKET_H_ #define __TCP_SOCKET_H_ #include #include #include #include /* See NOTES */ #include #include #include #include // 创建并初始化 tcp 服务器 socket extern int create_tcp_server_socket(const char *ip,unsigned short port); // 用于创建tcp客户端连接 extern int create_tcp_client_socket(const char *server_ip,unsigned short server_port); //等待与客户端连接 extern int wait_for_connect(int sockfd, struct sockaddr_in* client_addr); #endif tcp_socket.c #include "tcp_socket.h" #include "debug.h" #define BACKLOG 10 int create_tcp_server_socket(const char *ip,unsigned short port) { int sfd; int ret; struct sockaddr_in server_addr; socklen_t len = sizeof(struct sockaddr_in); //1、创建套接字 sfd = socket(AF_INET, SOCK_STREAM, 0); if(sfd == -1) { DEBUG_INFO("[ERROR] socket:%s\n", strerror(errno)); return -1; } bzero(&server_addr, len); //地址族/协议族 与socket函数第一个参数相同 server_addr.sin_family = AF_INET; server_addr.sin_port = htons(port); server_addr.sin_addr.s_addr = inet_addr(ip); //2、绑定ip,端口号 ret = bind(sfd, (const struct sockaddr *) &server_addr, len); if(ret == -1) { DEBUG_INFO("[ERROR] bind():%s\n", strerror(errno)); return -1; } //3、设置套接字为监听状态,建立监听队列,如果服务端处理不过来的话,会把客户端连接请求缓存在监听队列里,如果超过最大队列数量,那么会被拒绝连接 ret = listen(sfd, BACKLOG); if(ret == -1) { DEBUG_INFO("[ERROR] listen():%s\n", strerror(errno)); return -1; } return sfd; } int create_tcp_client_socket(const char *server_ip,unsigned short server_port) { int sfd; int ret; struct sockaddr_in server_addr; //1、创建套接字 sfd = socket(AF_INET, SOCK_STREAM, 0); if(sfd == -1) { DEBUG_INFO("[ERROR] socket():%s\n", strerror(errno)); return -1; } bzero(&server_addr, sizeof(struct sockaddr_in)); //地址族/协议族 与socket函数第一个参数相同 server_addr.sin_family = AF_INET; server_addr.sin_port = htons(server_port); server_addr.sin_addr.s_addr = inet_addr(server_ip); ret = connect(sfd, (const struct sockaddr *) &server_addr, sizeof(struct sockaddr_in)); if(ret == -1) { DEBUG_INFO("[ERROR] connect():%s\n", strerror(errno)); return -1; } return sfd; } int wait_for_connect(int sockfd, struct sockaddr_in* client_addr) { int cfd; socklen_t len = sizeof(struct sockaddr_in); cfd = accept(sockfd, (struct sockaddr *)client_addr, &len); if(cfd == -1) { DEBUG_INFO("[ERROR] accept():%s\n", strerror(errno)); return -1; } return cfd; }

得分 100
学习任务

大禹123 的学生作业:

debug.h #ifndef _DEBUG_H_ #define _DEBUG_H_ /* __FILE__:输出文件名 __FUNCTION__:输出函数名 __LINE__:输出行号 }while:括号要与while连接在一起 */ #define DEBUG_INFO(args...) do{ \ char b__[1024];\ sprintf(b__,args);\ fprintf(stderr,"[%s,%s,%d] : %s", __FILE__ , __FUNCTION__ ,__LINE__ ,b__); \ }while(0) #endif tcp_socket.h #ifndef __TCP_SOCKET_H_ #define __TCP_SOCKET_H_ #include #include #include #include /* See NOTES */ #include #include #include #include // 创建并初始化 tcp 服务器 socket extern int create_tcp_server_socket(const char *ip,unsigned short port); #endif tcp_socket.c #include "tcp_socket.h" #include "debug.h" #define BACKLOG 10 int create_tcp_server_socket(const char *ip,unsigned short port) { int sfd; int ret; struct sockaddr_in server_addr; socklen_t len = sizeof(struct sockaddr_in); //1、创建套接字 sfd = socket(AF_INET, SOCK_STREAM, 0); if(sfd == -1) { DEBUG_INFO("[ERROR] socket:%s\n", strerror(errno)); return -1; } bzero(&server_addr, len); //地址族/协议族 与socket函数第一个参数相同 server_addr.sin_family = AF_INET; server_addr.sin_port = htons(port); server_addr.sin_addr.s_addr = inet_addr(ip); //2、绑定ip,端口号 ret = bind(sfd, (const struct sockaddr *) &server_addr, len); if(ret == -1) { DEBUG_INFO("[ERROR] bind():%s\n", strerror(errno)); return -1; } //3、设置套接字为监听状态,建立监听队列,如果服务端处理不过来的话,会把客户端连接请求缓存在监听队列里,如果超过最大队列数量,那么会被拒绝连接 ret = listen(sfd, BACKLOG); if(ret == -1) { DEBUG_INFO("[ERROR] listen():%s\n", strerror(errno)); return -1; } return sfd; }

得分 100
学习任务

大禹123 的学生作业:

#include #include #include #include #include #include /* See NOTES */ #include #include #include #include #include #include //这个适合约定了数据包的 #define BACKLOG 10 void *do_pthread_client(void *arg) { int cfd = *(int *)arg; ssize_t rbytes = 0, sbytes = 0; char buf[1024] = {0}; while(1){ //首先获取数据包的大小 rbytes = recv(cfd, (void *)buf, sizeof(buf), 0); if(rbytes == -1) { perror("[ERROR] recv()"); close(cfd); pthread_exit(NULL); }else if(rbytes > 0){ printf("buf:%s\n", buf); send(cfd, buf, strlen(buf)+1, 0); }else if(rbytes == 0) { printf("client has shutdown\n"); pthread_exit(NULL); } } close(cfd); pthread_exit(NULL); } //a.out ip port int main(int argc, char const *argv[]) { int sockfd, cfd; int ret; pthread_t tid; struct sockaddr_in server_addr; struct sockaddr_in client_addr; socklen_t len = sizeof(struct sockaddr_in); if(argc!=3) { fprintf(stderr,"Usage: %s ip port",argv[0]); exit(EXIT_FAILURE); } //1、创建套接字 sockfd = socket(AF_INET, SOCK_STREAM, 0); if(sockfd == -1) { perror("[ERROR] socket()"); exit(EXIT_FAILURE); } bzero(&server_addr, len); bzero(&client_addr, len); //地址族/协议族 与socket函数第一个参数相同 server_addr.sin_family = AF_INET; server_addr.sin_port = htons(atoi(argv[2])); server_addr.sin_addr.s_addr = inet_addr(argv[1]); //2、绑定ip,端口号 ret = bind(sockfd, (const struct sockaddr *) &server_addr, len); if(ret == -1) { perror("[ERROR] bind()"); exit(EXIT_FAILURE); } //3、设置套接字为监听状态,建立监听队列,如果服务端处理不过来的话,会把客户端连接请求缓存在监听队列里,如果超过最大队列数量,那么会被拒绝连接 ret = listen(sockfd, BACKLOG); if(ret == -1) { perror("[ERROR] listen()"); exit(EXIT_FAILURE); } while(1) { //通过循环,不停地从监听队列里边移除,可以让新的客户端连接进来 cfd = accept(sockfd, (struct sockaddr *)&client_addr, &len); if(cfd == -1) { perror("[ERROR] accept()"); exit(EXIT_FAILURE); } printf("client ip:%s port:%d\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port)); ret = pthread_create(&tid, NULL, do_pthread_client, (void *)&cfd); if(ret!=0) { fprintf(stderr,"[ERROR] pthread_create(): \n", strerror(ret)); exit(EXIT_FAILURE); } pthread_detach(tid); } close(cfd); close(sockfd); return 0; } 【图片】【图片】

得分 100
学习任务

大禹123 的学生作业:

client #include #include #include #include #include #include /* See NOTES */ #include #include #include void send_data(int sockfd) { int ret; char buf[256] = {0}; int i = 0; int length = 0; char *pbuff = NULL; while(1) { i++; memset(buf, 0 ,sizeof(buf)); // putchar('>'); // fgets(buf, sizeof(buf), stdin); // buf[strlen(buf)-1] = '\0'; sprintf(buf, "%d", i); strcat(buf, ":hello, server "); length = strlen(buf); //分配动态内存, 分为两段,前部为该数据实际大小,后部位数据段 pbuff = (char *)malloc(length + 4); //拷贝数据段的大小到内存前部,大小为4个字节 memcpy(pbuff, &length, 4); //拷贝数据段到内存后部,大小为数据段大小 memcpy(pbuff + 4, buf, length); ret = send(sockfd, (const void *)pbuff, length + 4, 0); if(ret == -1) { perror("[ERROR] send():"); close(sockfd); exit(EXIT_FAILURE); } if(strncmp(buf, "quit", 4) == 0) { break; } } close(sockfd); exit(EXIT_SUCCESS); } //a.out ip port int main(int argc, char const *argv[]) { int sockfd; int ret; struct sockaddr_in server_addr; if(argc!=3) { fprintf(stderr,"Usage: %s ip port",argv[0]); exit(EXIT_FAILURE); } //1、创建套接字 sockfd = socket(AF_INET, SOCK_STREAM, 0); if(sockfd == -1) { perror("[ERROR] socket()"); exit(EXIT_FAILURE); } bzero(&server_addr, sizeof(struct sockaddr_in)); //地址族/协议族 与socket函数第一个参数相同 server_addr.sin_family = AF_INET; server_addr.sin_port = htons(atoi(argv[2])); server_addr.sin_addr.s_addr = inet_addr(argv[1]); ret = connect(sockfd, (const struct sockaddr *) &server_addr, sizeof(struct sockaddr_in)); if(ret == -1) { perror("[ERROR] connect()"); exit(EXIT_FAILURE); } send_data(sockfd); close(sockfd); return 0; } server #include #include #include #include #include #include /* See NOTES */ #include #include #include #define BACKLOG 10 //a.out ip port int main(int argc, char const *argv[]) { int sockfd, cfd; int ret; struct sockaddr_in server_addr; struct sockaddr_in client_addr; ssize_t rbytes = 0, sbytes = 0; char buf[1024] = {0}; socklen_t len = sizeof(struct sockaddr_in); if(argc!=3) { fprintf(stderr,"Usage: %s ip port",argv[0]); exit(EXIT_FAILURE); } //1、创建套接字 sockfd = socket(AF_INET, SOCK_STREAM, 0); if(sockfd == -1) { perror("[ERROR] socket()"); exit(EXIT_FAILURE); } bzero(&server_addr, len); bzero(&client_addr, len); //地址族/协议族 与socket函数第一个参数相同 server_addr.sin_family = AF_INET; server_addr.sin_port = htons(atoi(argv[2])); server_addr.sin_addr.s_addr = inet_addr(argv[1]); //2、绑定ip,端口号 ret = bind(sockfd, (const struct sockaddr *) &server_addr, len); if(ret == -1) { perror("[ERROR] bind()"); exit(EXIT_FAILURE); } //3、设置套接字为监听状态,建立监听队列,如果服务端处理不过来的话,会把客户端连接请求缓存在监听队列里,如果超过最大队列数量,那么会被拒绝连接 ret = listen(sockfd, BACKLOG); if(ret == -1) { perror("[ERROR] listen()"); exit(EXIT_FAILURE); } cfd = accept(sockfd, (struct sockaddr *)&client_addr, &len); if(cfd == -1) { perror("[ERROR] accept()"); exit(EXIT_FAILURE); } // printf("client ip:%s port:%d\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port)); while(1){ int length = 0; int total_recived = 0; //首先获取数据包的大小 rbytes = recv(cfd, (void *)&length, 4, 0); if(rbytes == -1) { perror("[ERROR] recv()"); close(cfd); close(sockfd); exit(EXIT_FAILURE); } while (1) { //buf + total_recived rbytes = recv(cfd, buf + total_recived, length - total_recived, 0); if(rbytes == -1) { perror("[ERROR] recv()"); close(cfd); close(sockfd); exit(EXIT_FAILURE); }else if(rbytes > 0) { total_recived +=rbytes; if(total_recived == length) { break; } }else if(rbytes == 0) //表示客户端已经退出了 { printf("client ip:%s port:%d has shutdown", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port)); } } printf("buf: %s\n", buf); sleep(1); } close(cfd); close(sockfd); return 0; } result【图片】

得分 100
学习任务

大禹123 的学生作业:

TCP粘包问题主要由以下几个方面引起: 1、发送方的Nagle算法:TCP协议为了提高传输效率,默认采用了Nagle算法。该算法会将多个数据量小的数据包合并成一个大的数据块后再发送,从而减少发送次数和提升传输效率。这种合并发送的行为可能导致接收方在接收时难以分辨原始数据包的边界,从而产生粘包现象。 2、接收方的缓冲区处理:TCP是基于字节流的协议,并不了解上层应用发送的消息边界。接收方在读取数据时,可能会一次性读取多个发送的小数据包,形成一个大的数据包接收,从而导致粘包。 3、网络传输的延迟和缓冲区的限制:网络传输的延迟和接收方缓冲区的限制也可能导致粘包现象的发生。当网络延迟较大或接收方缓冲区较小时,多个数据包可能会因为等待被处理而粘连在一起。 client #include #include #include #include #include #include /* See NOTES */ #include #include #include void send_data(int sockfd) { int ret; char buf[256] = {0}; int i = 0; while(1) { i++; memset(buf, 0 ,sizeof(buf)); // putchar('>'); // fgets(buf, sizeof(buf), stdin); // buf[strlen(buf)-1] = '\0'; sprintf(buf, "%d", i); strcat(buf, ":hello, server "); ret = send(sockfd, (const void *)&buf, strlen(buf), 0); if(ret == -1) { perror("[ERROR] send():"); close(sockfd); exit(EXIT_FAILURE); } if(strncmp(buf, "quit", 4) == 0) { break; } } close(sockfd); exit(EXIT_SUCCESS); } //a.out ip port int main(int argc, char const *argv[]) { int sockfd; int ret; struct sockaddr_in server_addr; if(argc!=3) { fprintf(stderr,"Usage: %s ip port",argv[0]); exit(EXIT_FAILURE); } //1、创建套接字 sockfd = socket(AF_INET, SOCK_STREAM, 0); if(sockfd == -1) { perror("[ERROR] socket()"); exit(EXIT_FAILURE); } bzero(&server_addr, sizeof(struct sockaddr_in)); //地址族/协议族 与socket函数第一个参数相同 server_addr.sin_family = AF_INET; server_addr.sin_port = htons(atoi(argv[2])); server_addr.sin_addr.s_addr = inet_addr(argv[1]); ret = connect(sockfd, (const struct sockaddr *) &server_addr, sizeof(struct sockaddr_in)); if(ret == -1) { perror("[ERROR] connect()"); exit(EXIT_FAILURE); } send_data(sockfd); close(sockfd); return 0; } server #include #include #include #include #include #include /* See NOTES */ #include #include #include #define BACKLOG 10 //a.out ip port int main(int argc, char const *argv[]) { int sockfd, cfd; int ret; struct sockaddr_in server_addr; struct sockaddr_in client_addr; ssize_t rbytes = 0, sbytes = 0; char buf[1024] = {0}; socklen_t len = sizeof(struct sockaddr_in); if(argc!=3) { fprintf(stderr,"Usage: %s ip port",argv[0]); exit(EXIT_FAILURE); } //1、创建套接字 sockfd = socket(AF_INET, SOCK_STREAM, 0); if(sockfd == -1) { perror("[ERROR] socket()"); exit(EXIT_FAILURE); } bzero(&server_addr, len); bzero(&client_addr, len); //地址族/协议族 与socket函数第一个参数相同 server_addr.sin_family = AF_INET; server_addr.sin_port = htons(atoi(argv[2])); server_addr.sin_addr.s_addr = inet_addr(argv[1]); //2、绑定ip,端口号 ret = bind(sockfd, (const struct sockaddr *) &server_addr, len); if(ret == -1) { perror("[ERROR] bind()"); exit(EXIT_FAILURE); } //3、设置套接字为监听状态,建立监听队列,如果服务端处理不过来的话,会把客户端连接请求缓存在监听队列里,如果超过最大队列数量,那么会被拒绝连接 ret = listen(sockfd, BACKLOG); if(ret == -1) { perror("[ERROR] listen()"); exit(EXIT_FAILURE); } cfd = accept(sockfd, (struct sockaddr *)&client_addr, &len); if(cfd == -1) { perror("[ERROR] accept()"); exit(EXIT_FAILURE); } // printf("client ip:%s port:%d\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port)); while(1){ rbytes = recv(cfd, (void *)buf, sizeof(buf), 0); if(rbytes == -1) { perror("[ERROR] recv()"); close(cfd); close(sockfd); exit(EXIT_FAILURE); }else if(rbytes > 0) { printf("%s\n", buf); if(strncmp(buf, "quit", 4) == 0) { break; } }else if(rbytes == 0) //表示客户端已经退出了 { printf("client ip:%s port:%d has shutdown", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port)); break; } sleep(1); } close(cfd); close(sockfd); return 0; } 【图片】

得分 100
学习任务

大禹123 的学生作业:

server.c #include #include #include #include #include #include /* See NOTES */ #include #include #include #define BACKLOG 10 //a.out ip port int main(int argc, char const *argv[]) { int sockfd, cfd; int ret; struct sockaddr_in server_addr; struct sockaddr_in client_addr; ssize_t rbytes = 0, sbytes = 0; char buf[1024] = {0}; socklen_t len = sizeof(struct sockaddr_in); if(argc!=3) { fprintf(stderr,"Usage: %s ip port",argv[0]); exit(EXIT_FAILURE); } //1、创建套接字 sockfd = socket(AF_INET, SOCK_STREAM, 0); if(sockfd == -1) { perror("[ERROR] socket()"); exit(EXIT_FAILURE); } bzero(&server_addr, len); bzero(&client_addr, len); //地址族/协议族 与socket函数第一个参数相同 server_addr.sin_family = AF_INET; server_addr.sin_port = htons(atoi(argv[2])); server_addr.sin_addr.s_addr = inet_addr(argv[1]); //2、绑定ip,端口号 ret = bind(sockfd, (const struct sockaddr *) &server_addr, len); if(ret == -1) { perror("[ERROR] bind()"); exit(EXIT_FAILURE); } //3、设置套接字为监听状态,建立监听队列,如果服务端处理不过来的话,会把客户端连接请求缓存在监听队列里,如果超过最大队列数量,那么会被拒绝连接 ret = listen(sockfd, BACKLOG); if(ret == -1) { perror("[ERROR] listen()"); exit(EXIT_FAILURE); } cfd = accept(sockfd, (struct sockaddr *)&client_addr, &len); if(cfd == -1) { perror("[ERROR] accept()"); exit(EXIT_FAILURE); } printf("client ip:%s port:%d\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port)); while(1){ rbytes = recv(cfd, (void *)buf, sizeof(buf), 0); if(rbytes == -1) { perror("[ERROR] recv()"); close(cfd); close(sockfd); exit(EXIT_FAILURE); }else if(rbytes > 0) { printf("client ip:%s port:%d msg: %s\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port), buf); if(strncmp(buf, "quit", 4) == 0) { break; } }else if(rbytes == 0) //表示客户端已经退出了 { printf("client ip:%s port:%d has shutdown", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port)); break; } } close(cfd); close(sockfd); return 0; } client.c #include #include #include #include #include #include /* See NOTES */ #include #include #include void send_data(int sockfd) { int ret; char buf[256] = {0}; while(1) { memset(buf, 0 ,sizeof(buf)); putchar('>'); fgets(buf, sizeof(buf), stdin); buf[strlen(buf)-1] = '\0'; ret = send(sockfd, (const void *)&buf, strlen(buf), 0); if(ret == -1) { perror("[ERROR] send():"); close(sockfd); exit(EXIT_FAILURE); } if(strncmp(buf, "quit", 4) == 0) { break; } } close(sockfd); exit(EXIT_SUCCESS); } //a.out ip port int main(int argc, char const *argv[]) { int sockfd; int ret; struct sockaddr_in server_addr; if(argc!=3) { fprintf(stderr,"Usage: %s ip port",argv[0]); exit(EXIT_FAILURE); } //1、创建套接字 sockfd = socket(AF_INET, SOCK_STREAM, 0); if(sockfd == -1) { perror("[ERROR] socket()"); exit(EXIT_FAILURE); } bzero(&server_addr, sizeof(struct sockaddr_in)); //地址族/协议族 与socket函数第一个参数相同 server_addr.sin_family = AF_INET; server_addr.sin_port = htons(atoi(argv[2])); server_addr.sin_addr.s_addr = inet_addr(argv[1]); ret = connect(sockfd, (const struct sockaddr *) &server_addr, sizeof(struct sockaddr_in)); if(ret == -1) { perror("[ERROR] connect()"); exit(EXIT_FAILURE); } send_data(sockfd); close(sockfd); return 0; } result【图片】

得分 100
学习任务

大禹123 的学生作业:

#include #include #include #include #include #include /* See NOTES */ #include #include #include #define BACKLOG 10 //a.out ip port int main(int argc, char const *argv[]) { int sockfd, cfd; int ret; struct sockaddr_in server_addr; struct sockaddr_in client_addr; socklen_t len = sizeof(struct sockaddr_in); if(argc!=3) { fprintf(stderr,"Usage: %s ip port",argv[0]); exit(EXIT_FAILURE); } //1、创建套接字 sockfd = socket(AF_INET, SOCK_STREAM, 0); if(sockfd == -1) { perror("[ERROR] socket()"); exit(EXIT_FAILURE); } bzero(&server_addr, len); bzero(&client_addr, len); //地址族/协议族 与socket函数第一个参数相同 server_addr.sin_family = AF_INET; server_addr.sin_port = htons(atoi(argv[2])); server_addr.sin_addr.s_addr = inet_addr(argv[1]); //2、绑定ip,端口号 ret = bind(sockfd, (const struct sockaddr *) &server_addr, len); if(ret == -1) { perror("[ERROR] bind()"); exit(EXIT_FAILURE); } //3、设置套接字为监听状态,建立监听队列,如果服务端处理不过来的话,会把客户端连接请求缓存在监听队列里,如果超过最大队列数量,那么会被拒绝连接 ret = listen(sockfd, BACKLOG); if(ret == -1) { perror("[ERROR] listen()"); exit(EXIT_FAILURE); } cfd = accept(sockfd, (struct sockaddr *)&client_addr, &len); if(cfd == -1) { perror("[ERROR] accept()"); exit(EXIT_FAILURE); } printf("client ip:%s port:%d\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port)); while(1); close(cfd); close(sockfd); return 0; } 【图片】

得分 100
学习任务

阿大月 的学生作业:

main.c #include "squelist.h" int main() { seqlist_t *l = create_empty_seqlist(); datatype_t st; int delete_ret; int delete_id; printf("请输入学生信息:\n"); while(is_full_seqlist(l)){ scanf("%s%d%d", st.name, &(st.id), &(st.age)); insert_data_seqlist(l, st); } printf_data_seqlist(l); printf("请输入要删除的学生的id:"); scanf("%d", &delete_id); delete_ret = delete_data_seqlist(l, delete_id); if (delete_ret == -2){ printf("没有这个学生的信息\n"); }else if(delete_ret == -1){ printf("学生信息为空\n"); }else{ printf("删除成功\n"); } printf_data_seqlist(l); return 0; } squelist.c #include "squelist.h" seqlist_t *create_empty_seqlist() { seqlist_t *l = (seqlist_t*)malloc(sizeof(seqlist_t)); if (NULL == l){ printf("malloc is failed\n"); return NULL; } memset(l, 0, sizeof(seqlist_t)); return l; } int is_full_seqlist(seqlist_t *l) { if (l->n >= MAX) return 0; return 1; } void insert_data_seqlist(seqlist_t *l,datatype_t data) { l->buf[l->n] = data; l->n++; } void printf_data_seqlist(seqlist_t *l) { int i = 0; printf("NAME\tID\tage\n"); for (i=0;in;i++){ printf("%s\t%d\t%d\n", (l->buf)[i].name, (l->buf)[i].id, (l->buf)[i].age); } } int is_empty_seqlist(seqlist_t *l) { return l->n > 0? 1: 0; } int delete_data_seqlist(seqlist_t *l, int id) { if (!is_empty_seqlist){ return -1; } int i, j=0; for (i=0;in;i++){ if ((l->buf)[i].id != id){ (l->buf)[j] = (l->buf)[i]; j++; } } if (i == j){ return -2; }else{ l->n = j; return 0; } } squelist.h #ifndef __SQUELIST_H__ #define __SQUELIST_H__ // 头文件中放的都是宏、结构体的定义声明,对应.c文件中的函数声明,全局变量的extren的声明 #include #include #include #define MAX 3 //实际学⽣的存储 struct student { char name[20]; int id; int age; }; typedef struct student datatype_t; typedef struct{ datatype_t buf[MAX]; //定义数组记录班级学⽣每个学⽣的信息。 int n; //学⽣实际到来的个数。 }seqlist_t; seqlist_t *create_empty_seqlist(); int is_full_seqlist(seqlist_t *l); void insert_data_seqlist(seqlist_t *l,datatype_t data); void printf_data_seqlist(seqlist_t *l); int is_empty_seqlist(seqlist_t *l); int delete_data_seqlist(seqlist_t *l, int id); #endif

得分 100
学习任务

胡汉三66 的学生作业:

ex_epoll_write.c #include #include #include #include #include #include #include #define PATH "./fifo_test" //定义管道文件名 #define MAXEVENTS 10 //定义 最大的 就绪的 epoll事件数目 //使用 epoll 函数监控 有名管道,如果 有名管道有数据时,读取数据并打印 int main(void) { int ret,fd_f; ret = mkfifo(PATH,0644);//创建有名管道 if (ret == -1) { perror("[ERROR] mkfifo() :\n"); exit(EXIT_FAILURE); } fd_f = open(PATH,O_RDONLY);//以 只读方式 打开管道文件,返回 管道 文件描述符 if (fd_f == -1) { perror("[ERROR] open ():\n"); exit(EXIT_FAILURE); } //创建epoll实例 以及 处理 epoll实例 int epfd; epfd = epoll_create(1);//创建一个epoll实例 if (epfd == -1) { perror("[ERROR] epoll_create ():\n"); exit(EXIT_FAILURE); } printf("epfd = %d\n",epfd); struct epoll_event ev;//定义epoll实例(关联文件描述符) ev.data.fd = fd_f;//"fd_f": 管道 文件描述符 ev.events = EPOLLIN;//定义epoll事件:EPOLLIN===>读事件有效(与文件描述符 关联) ret = epoll_ctl(epfd,EPOLL_CTL_ADD,fd_f,&ev);//epoll实例中 添加 epoll事件(包含关联的 文件描述符) if (ret == -1) { perror("[ERROR] epoll_ctl() :\n"); close(fd_f);//关闭文件描述符 exit(EXIT_FAILURE); } for(;;) { struct epoll_event res_ev[MAXEVENTS];//定义 储存 epoll事件 就绪集合 的数组(epoll事件包含 关联的 文件描述符) ret = epoll_wait(epfd,res_ev,MAXEVENTS,1000);//等待结果就绪(包含文件描述符) "1000":超时时间 1000毫秒 if (ret == -1) { perror("[ERROR] epoll_wait() :\n"); close(fd_f);//关闭文件描述符 exit(EXIT_FAILURE); }else if(ret == 0)//等待时间超时 { printf("Timeout.\n"); }else if(ret > 0) { int i = 0; for(i = 0;i < MAXEVENTS;i++) { if(res_ev[i].events == EPOLLIN)//判断就绪集合中 是否有 读事件 { char buffer[64]; ssize_t rbytes; rbytes = read(fd_f,buffer,64);//从管道文件中 读取数据 保存在 数组buffer中 if(rbytes == -1) { perror("[ERROR] read() :\n"); exit(EXIT_FAILURE); } printf("buffer : %s \n",buffer); } } } } close(fd_f);//关闭文件描述符 return 0; } ex_write.c #include #include #include #include #include #include #define PATH "./fifo_test" //定义管道文件名 //循环 输入数据 到 管道文件 中 int main(void) { int fd_f; ssize_t wbytes;//定义实际写入的字节数 char buffer[64] = {0}; fd_f = open(PATH,O_WRONLY);//以 只写方式 打开 管道文件,并返回文件描述符 if (fd_f == -1) { perror("[ERROE] open() :\n"); exit(EXIT_FAILURE); } for(;;) { fgets(buffer,sizeof(buffer),stdin);//从标准输入 获取 一行数据,保存在buffer中 wbytes = write(fd_f,buffer,64);//将数组buffer中的数据 写入 管道文件 中 if (wbytes == -1) { perror("[ERROR] write() :\n"); close(fd_f); exit(EXIT_FAILURE); } } close(fd_f);//关闭文件描述符 return 0; } 管道输入【图片】 管道输出: 【图片】

得分 100
学习任务

大禹123 的学生作业:

#include #include #include #include #include #include /* See NOTES */ #include #include #include #include void send_data(int sockfd) { int ret; char buf[256] = {0}; while(1) { memset(buf, 0 ,sizeof(buf)); putchar('>'); fgets(buf, sizeof(buf), stdin); buf[strlen(buf)-1] = '\0'; ret = send(sockfd, (const void *)&buf, strlen(buf), 0); if(ret == -1) { perror("[ERROR] send():"); close(sockfd); exit(EXIT_FAILURE); } if(strncmp(buf, "quit", 4) == 0) { break; } } close(sockfd); exit(EXIT_SUCCESS); } void *rec_message(void *arg) { int sockfd = *(int *)arg; int ret; char buf[256] = {0}; printf("please input msg data:\n"); while(1) { memset(buf, 0 ,sizeof(buf)); putchar('>'); ret = recv(sockfd, (void *)buf, sizeof(buf), 0); if(ret == -1) { perror("[ERROR] recv():"); close(sockfd); exit(EXIT_FAILURE); } printf("recive buf: %s\n", buf); if(strncmp(buf, "quit", 4) == 0) { break; } } close(sockfd); exit(EXIT_SUCCESS); } //a.out ip port int main(int argc, char const *argv[]) { int sockfd; int ret; pthread_t tid; struct sockaddr_in server_addr; if(argc!=3) { fprintf(stderr,"Usage: %s ip port",argv[0]); exit(EXIT_FAILURE); } //1、创建套接字 sockfd = socket(AF_INET, SOCK_STREAM, 0); if(sockfd == -1) { perror("[ERROR] socket()"); exit(EXIT_FAILURE); } bzero(&server_addr, sizeof(struct sockaddr_in)); //地址族/协议族 与socket函数第一个参数相同 server_addr.sin_family = AF_INET; server_addr.sin_port = htons(atoi(argv[2])); server_addr.sin_addr.s_addr = inet_addr(argv[1]); ret = connect(sockfd, (const struct sockaddr *) &server_addr, sizeof(struct sockaddr_in)); if(ret == -1) { perror("[ERROR] connect()"); exit(EXIT_FAILURE); } ret = pthread_create(&tid, NULL, rec_message, (void *)&sockfd); if(ret!=0) { fprintf(stderr,"[ERROR] pthread_create(): %s\n", strerror(ret)); exit(EXIT_FAILURE); } pthread_detach(tid); send_data(sockfd); close(sockfd); return 0; } 【图片】

微信客服

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

帮助反馈 APP下载

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

公众号

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