亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

作業社區

探索學習新天地,共享知識資源!

0 提交作業
0 布置作業
0 滿分作業
得分 100
學習任務

史啦啦 的學生作業:

【圖片】 #include #include #include #include #include #include #include #include #include #include #include #include #define BACKLOG 10 void do_sigchild(int sig) { wait(NULL); } void *do_process_client(void *arg) { ssize_t rbytes = 0,sbytes = 0; char buffer[1024] = {0}; int cfd = *(int *)arg; for(;;) { rbytes = recv(cfd,buffer,sizeof(buffer),0); if(rbytes == -1) { perror("[ERROR] Failed to recv."); pthread_exit(NULL); } else if(rbytes > 0) { sbytes = send(cfd,buffer,strlen(buffer),0); if(sbytes == -1) { perror("[ERROR] Failed to recv"); pthread_exit(NULL); } } else if(rbytes == 0) { printf("The client has been shutdown.\n"); break; } } close(cfd); return 0; } int main(int argc,char *argv[]) { int sfd,ret,cfd; struct sockaddr_in svr_addr,cli_addr; pthread_t tid; socklen_t len = sizeof(struct sockaddr_in); if(argc != 3) { fprintf(stderr,"Usage : %s .\n",argv[0]); exit(EXIT_FAILURE); } __sighandler_t sigret; sigret = signal(SIGCHLD,do_sigchild); if(sigret == SIG_ERR) { perror("[ERROR] Failed to signal."); exit(EXIT_FAILURE); } //創建套接字 sfd = socket(AF_INET,SOCK_STREAM,0); if(sfd == -1) { perror("[ERROR] Failed to 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)); if(ret == -1) { perror("[ERROR] Failed to bind"); exit(EXIT_FAILURE); } ret = listen(sfd,BACKLOG); if(ret == -1) { perror("[ERROR] Failed to listen"); exit(EXIT_FAILURE); } for(;;) { cfd = accept(sfd,(struct sockaddr *)&cli_addr,&len); if(cfd == -1) { perror("[ERROR] Failed to 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_client,(void *)&cfd); if(ret != 0) { fprintf(stderr,"pthread_create(): %s\n",strerror(ret)); exit(EXIT_FAILURE); } pthread_detach(tid); } close(sfd); return 0; }

得分 100
學習任務

jelasin 的學生作業:

TCP流式協議特性 TCP是面向流的協議,它將數據看作連續的字節流,而不是獨立的數據包。發送端的多次寫操作可能被接收端的一次讀操作接收,或者發送端的一次寫操作可能需要接收端多次讀操作才能完整接收。 Nagle算法優化 為了提高網絡效率,TCP實現了Nagle算法。該算法會將小的數據包合并成較大的數據包再發送,這樣可以減少網絡中的小包數量,提高傳輸效率。但這也導致了原本獨立的數據包被合并,在接收端出現粘包現象。 TCP緩沖區機制 發送端和接收端都有緩沖區。發送端的緩沖區可能會積累多個小的數據包后一起發送;接收端的緩沖區也可能一次接收到多個數據包的內容。這種緩沖機制雖然提高了效率,但也是造成粘包的重要原因。 網絡傳輸延遲和擁塞控制 在網絡傳輸過程中,由于延遲、擁塞控制等因素,原本分開發送的數據包可能會在傳輸路徑中被合并或重新組織。 應用層讀取方式 應用程序在讀取數據時,如果一次讀取的字節數超過了單個消息的長度,就會讀取到多個消息的內容,造成粘包。 //client #include #include #include #include #include #include #define PORT 8080 #define SERVER_IP "127.0.0.1" int main() { int sock = 0; struct sockaddr_in serv_addr; // 創建socket if ((sock = socket(AF_INET, SOCK_STREAM, 0))

得分 100
學習任務

jelasin 的學生作業:

#include #include #include #include #include #include #include #include #define SERVER_PORT 8080 #define BACKLOG 10 #define BUFFER_SIZE 1024 // 客戶端信息結構體 typedef struct { int client_socket; struct sockaddr_in client_addr; } client_info_t; // 線程處理函數:處理單個客戶端連接 void* handle_client(void* arg) { client_info_t* client_info = (client_info_t*)arg; int client_socket = client_info->client_socket; struct sockaddr_in client_addr = client_info->client_addr; printf("[線程 %ld] 開始處理客戶端: %s:%d\n", pthread_self(), inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port)); char buffer[BUFFER_SIZE]; ssize_t bytes_received; // 與客戶端通信循環 while (1) { bytes_received = recv(client_socket, buffer, BUFFER_SIZE - 1, 0); if (bytes_received > 0) { buffer[bytes_received] = '\0'; printf("[線程 %ld] 收到消息: %s", pthread_self(), buffer); // 簡單回顯 - 增加響應緩沖區大小以避免截斷警告 char response[BUFFER_SIZE + 64]; // 為格式化字符串預留額外空間 snprintf(response, sizeof(response), "[線程 %ld] Echo: %s", pthread_self(), buffer); send(client_socket, response, strlen(response), 0); } else if (bytes_received == 0) { printf("[線程 %ld] 客戶端斷開連接: %s:%d\n", pthread_self(), inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port)); break; } else { perror("recv失敗"); break; } } close(client_socket); free(client_info); printf("[線程 %ld] 客戶端處理完成,線程退出\n", pthread_self()); pthread_exit(NULL); } // 函數:創建和綁定服務器socket int create_and_bind_server(const char* ip, int port) { int server_socket; struct sockaddr_in server_addr; int reuse = 1; // 1. 創建套接字 server_socket = socket(AF_INET, SOCK_STREAM, 0); if (server_socket == -1) { perror("socket創建失敗"); return -1; } printf("Socket創建成功 (fd: %d)\n", server_socket); // 設置SO_REUSEADDR選項 if (setsockopt(server_socket, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) == -1) { perror("setsockopt失敗"); close(server_socket); return -1; } // 2. 配置服務器地址結構 memset(&server_addr, 0, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_port = htons(port); // 根據IP參數設置綁定地址 if (ip == NULL || strcmp(ip, "0.0.0.0") == 0) { server_addr.sin_addr.s_addr = INADDR_ANY; // 綁定到所有可用接口 printf("配置為監聽所有接口 (0.0.0.0:%d)\n", port); } else { if (inet_aton(ip, &server_addr.sin_addr) == 0) { printf("無效的IP地址: %s\n", ip); close(server_socket); return -1; } printf("配置為監聽指定IP (%s:%d)\n", ip, port); } // 3. 綁定IP地址和端口號 if (bind(server_socket, (struct sockaddr*)&server_addr, sizeof(server_addr)) == -1) { perror("bind失敗"); close(server_socket); return -1; } printf("成功綁定到端口 %d\n", port); return server_socket; } int main(int argc, char *argv[]) { int server_socket; // 解析命令行參數 char *server_ip = NULL; int server_port = SERVER_PORT; if (argc >= 2) { server_port = atoi(argv[1]); if (server_port 65535) { printf("無效端口號: %s\n", argv[1]); exit(EXIT_FAILURE); } } if (argc >= 3) { server_ip = argv[2]; } // 創建和綁定服務器socket server_socket = create_and_bind_server(server_ip, server_port); if (server_socket == -1) { exit(EXIT_FAILURE); } // 4. 開始監聽 if (listen(server_socket, BACKLOG) == -1) { perror("listen失敗"); close(server_socket); exit(EXIT_FAILURE); } printf("服務器開始監聽,等待客戶端連接...\n"); printf("監聽隊列大小: %d (最多可同時等待 %d 個連接)\n", BACKLOG, BACKLOG); printf("服務器地址: %s:%d\n", server_ip ? server_ip : "0.0.0.0", server_port); // 5. 主循環:接受客戶端連接 while (1) { printf("\n等待新的客戶端連接...\n"); // 接受客戶端連接 struct sockaddr_in client_addr; socklen_t client_addr_len = sizeof(client_addr); int client_socket = accept(server_socket, (struct sockaddr*)&client_addr, &client_addr_len); if (client_socket == -1) { perror("accept失敗"); continue; } printf("客戶端連接成功: %s:%d (socket fd: %d)\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port), client_socket); // 創建結構體保存客戶端信息 client_info_t* client_info = (client_info_t*)malloc(sizeof(client_info_t)); if (client_info == NULL) { perror("malloc失敗"); close(client_socket); continue; } client_info->client_socket = client_socket; client_info->client_addr = client_addr; // 創建線程處理客戶端連接 pthread_t tid; if (pthread_create(&tid, NULL, handle_client, client_info) != 0) { perror("pthread_create失敗"); close(client_socket); free(client_info); } else { // 分離線程,在線程結束時自動回收資源 pthread_detach(tid); printf("為客戶端 %s:%d 創建處理線程 %ld\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port), tid); } } close(server_socket); return 0; } #include #include #include #include #include #include #include #define SERVER_IP "127.0.0.1" #define SERVER_PORT 8080 #define BUFFER_SIZE 1024 int main() { int client_socket; struct sockaddr_in server_addr; char buffer[BUFFER_SIZE]; ssize_t bytes_received; // 創建套接字 client_socket = socket(AF_INET, SOCK_STREAM, 0); if (client_socket == -1) { perror("socket創建失敗"); exit(EXIT_FAILURE); } // 配置服務器地址結構 memset(&server_addr, 0, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_port = htons(SERVER_PORT); server_addr.sin_addr.s_addr = inet_addr(SERVER_IP); // 連接到服務器 if (connect(client_socket, (struct sockaddr*)&server_addr, sizeof(server_addr)) == -1) { perror("連接服務器失敗"); close(client_socket); exit(EXIT_FAILURE); } printf("成功連接到服務器 %s:%d\n", SERVER_IP, SERVER_PORT); printf("輸入消息發送到服務器 (輸入'quit'退出):\n"); while (1) { // 從用戶獲取輸入 printf("客戶端> "); fflush(stdout); if (fgets(buffer, BUFFER_SIZE, stdin) == NULL) { break; } // 檢查退出條件 if (strncmp(buffer, "quit", 4) == 0) { printf("客戶端退出...\n"); break; } // 發送消息到服務器 ssize_t bytes_sent = send(client_socket, buffer, strlen(buffer), 0); if (bytes_sent == -1) { perror("發送消息失敗"); break; } // 接收服務器響應 bytes_received = recv(client_socket, buffer, BUFFER_SIZE - 1, 0); if (bytes_received > 0) { buffer[bytes_received] = '\0'; // 移除消息末尾的換行符(如果有的話) char *newline = strchr(buffer, '\n'); if (newline) *newline = '\0'; printf("服務器響應: %s\n", buffer); } else if (bytes_received == 0) { printf("服務器關閉了連接\n"); break; } else { perror("接收消息失敗"); break; } } // 關閉套接字 close(client_socket); return 0; }

得分 100
學習任務

jelasin 的學生作業:

#include #include #include #include #include #include #include #include #define SERVER_PORT 8080 #define BACKLOG 10 #define BUFFER_SIZE 1024 // 客戶端信息結構體 typedef struct { int client_socket; struct sockaddr_in client_addr; } client_info_t; // 線程處理函數:處理單個客戶端連接 void* handle_client(void* arg) { client_info_t* client_info = (client_info_t*)arg; int client_socket = client_info->client_socket; struct sockaddr_in client_addr = client_info->client_addr; printf("[線程 %ld] 開始處理客戶端: %s:%d\n", pthread_self(), inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port)); char buffer[BUFFER_SIZE]; ssize_t bytes_received; // 與客戶端通信循環 while (1) { bytes_received = recv(client_socket, buffer, BUFFER_SIZE - 1, 0); if (bytes_received > 0) { buffer[bytes_received] = '\0'; printf("[線程 %ld] 收到消息: %s", pthread_self(), buffer); // 簡單回顯 - 增加響應緩沖區大小以避免截斷警告 char response[BUFFER_SIZE + 64]; // 為格式化字符串預留額外空間 snprintf(response, sizeof(response), "[線程 %ld] Echo: %s", pthread_self(), buffer); send(client_socket, response, strlen(response), 0); } else if (bytes_received == 0) { printf("[線程 %ld] 客戶端斷開連接: %s:%d\n", pthread_self(), inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port)); break; } else { perror("recv失敗"); break; } } close(client_socket); free(client_info); printf("[線程 %ld] 客戶端處理完成,線程退出\n", pthread_self()); pthread_exit(NULL); } // 函數:創建和綁定服務器socket int create_and_bind_server(const char* ip, int port) { int server_socket; struct sockaddr_in server_addr; int reuse = 1; // 1. 創建套接字 server_socket = socket(AF_INET, SOCK_STREAM, 0); if (server_socket == -1) { perror("socket創建失敗"); return -1; } printf("Socket創建成功 (fd: %d)\n", server_socket); // 設置SO_REUSEADDR選項 if (setsockopt(server_socket, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) == -1) { perror("setsockopt失敗"); close(server_socket); return -1; } // 2. 配置服務器地址結構 memset(&server_addr, 0, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_port = htons(port); // 根據IP參數設置綁定地址 if (ip == NULL || strcmp(ip, "0.0.0.0") == 0) { server_addr.sin_addr.s_addr = INADDR_ANY; // 綁定到所有可用接口 printf("配置為監聽所有接口 (0.0.0.0:%d)\n", port); } else { if (inet_aton(ip, &server_addr.sin_addr) == 0) { printf("無效的IP地址: %s\n", ip); close(server_socket); return -1; } printf("配置為監聽指定IP (%s:%d)\n", ip, port); } // 3. 綁定IP地址和端口號 if (bind(server_socket, (struct sockaddr*)&server_addr, sizeof(server_addr)) == -1) { perror("bind失敗"); close(server_socket); return -1; } printf("成功綁定到端口 %d\n", port); return server_socket; } int main(int argc, char *argv[]) { int server_socket; // 解析命令行參數 char *server_ip = NULL; int server_port = SERVER_PORT; if (argc >= 2) { server_port = atoi(argv[1]); if (server_port 65535) { printf("無效端口號: %s\n", argv[1]); exit(EXIT_FAILURE); } } if (argc >= 3) { server_ip = argv[2]; } // 創建和綁定服務器socket server_socket = create_and_bind_server(server_ip, server_port); if (server_socket == -1) { exit(EXIT_FAILURE); } // 4. 開始監聽 if (listen(server_socket, BACKLOG) == -1) { perror("listen失敗"); close(server_socket); exit(EXIT_FAILURE); } printf("服務器開始監聽,等待客戶端連接...\n"); printf("監聽隊列大小: %d (最多可同時等待 %d 個連接)\n", BACKLOG, BACKLOG); printf("服務器地址: %s:%d\n", server_ip ? server_ip : "0.0.0.0", server_port); // 5. 主循環:接受客戶端連接 while (1) { printf("\n等待新的客戶端連接...\n"); // 接受客戶端連接 struct sockaddr_in client_addr; socklen_t client_addr_len = sizeof(client_addr); int client_socket = accept(server_socket, (struct sockaddr*)&client_addr, &client_addr_len); if (client_socket == -1) { perror("accept失敗"); continue; } printf("客戶端連接成功: %s:%d (socket fd: %d)\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port), client_socket); // 創建結構體保存客戶端信息 client_info_t* client_info = (client_info_t*)malloc(sizeof(client_info_t)); if (client_info == NULL) { perror("malloc失敗"); close(client_socket); continue; } client_info->client_socket = client_socket; client_info->client_addr = client_addr; // 創建線程處理客戶端連接 pthread_t tid; if (pthread_create(&tid, NULL, handle_client, client_info) != 0) { perror("pthread_create失敗"); close(client_socket); free(client_info); } else { // 分離線程,在線程結束時自動回收資源 pthread_detach(tid); printf("為客戶端 %s:%d 創建處理線程 %ld\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port), tid); } } close(server_socket); return 0; }

得分 100
學習任務

cjozGV 的學生作業:

#include "stdio.h" #include "string.h" #include "stdlib.h" #define MAX 10 struct student{ char name[20]; int id; int age; }; typedef struct student datatype_t; typedef struct { datatype_t buf[MAX]; //定義數組記錄班級學生每個學生的信息。 int n; //學生實際到來的個數。 }SeqList; //1.創建順序表 SeqList* create_empty_seqlist(){ //1.聲明指針并初始化為NULL SeqList *l = NULL; //2.在堆區分配內存 l = (SeqList*)malloc(sizeof(SeqList)); //3.檢查malloc是否成功 if (NULL == l){ printf("malloc is fail!\n"); return NULL; } //4.初始化內存 memset(l,0, sizeof(SeqList)); //5.顯示初始化關鍵成員 l->n = 0; return l; } //2.檢查順序表是否已滿 int is_full_seqlist(SeqList *l){ //檢查指針是否有效 if (NULL == l){ printf("error: seqlist_t pointer is NUlL.\n"); return 1; //返回已滿阻止后續操作 } //判斷是否已滿 return (l->n >=MAX) ? 1:0; } //3.插入學生數據 void insert_data_seqlist(SeqList *l,datatype_t data){ if (NULL == l || is_full_seqlist(l)){ return; } l->buf[l->n++] = data; } //4.輸出數據 void printf_data_seqlist(SeqList *l){ if(NULL == l){ return; } for (int i = 0; i < l->n; i++) { printf("Student %d:Name: %s, ID: %d, Age: %d\n", i+1,l->buf[i].name,l->buf[i].id,l->buf[i].age); } printf("----------------------------\n\n"); } int is_empty_seqlist(SeqList *l){ if (NULL == l){ return -1; } return (l->n == 0) ? 1:0; } int delete_data_seqlist(SeqList *l,int id){ if (NULL == l){ return -1; } if (is_empty_seqlist(l) == 1){ return -1; } int j = 0; int found = 0; //是否找到標記位 for (int i = 0; i n; i++) { if (l->buf[i].id != id){ l->buf[j] = l->buf[i]; j++; } else { found = 1; //找到匹配項 } } l->n = j; //更新元素個數 if (!found){ printf("error: Student (ID=%d) not found,deletion failed. \n",id); return -2; //未找到匹配項 } else { printf("Success: Delete student (ID: %d)\n",id); printf_data_seqlist(l); //打印刪除后的學生信息 return 0; } } // 安全輸入函數(避免 scanf 緩沖區問題) int safe_input(const char *prompt, char *buffer, int max_len) { printf("%s", prompt); if (fgets(buffer, max_len, stdin) == NULL) { return -1; // 輸入失敗 } // 去除換行符 buffer[strcspn(buffer, "\n")] = '\0'; return 0; } int main(){ SeqList* l = create_empty_seqlist(); if (NULL == l){ return -1; } char input_buf[100]; datatype_t data; printf("Enter student info (name id age), or 'q' to stop:\n"); //滿了只取前十 while (!is_full_seqlist(l)){ printf("Student %d: ",l->n + 1); if (safe_input("Student %d: ",input_buf, sizeof(input_buf)) != 0){ continue; } //檢查是否退出輸入 if (strcmp(input_buf,"q") == 0){ break; } // 嘗試解析輸入 if (sscanf(input_buf, "%s %d %d", data.name, &data.id, &data.age) != 3) { printf("Input error! Please enter in format: name id age\n"); continue; } insert_data_seqlist(l, data); printf_data_seqlist(l); } // 刪除測試 printf("\nEnter the ID of the student to delete: "); if (fgets(input_buf, sizeof(input_buf), stdin) == NULL) { printf("Invalid input!\n"); } else { int delete_id; if (sscanf(input_buf, "%d", &delete_id) != 1) { printf("Invalid ID input!\n"); } else { delete_data_seqlist(l, delete_id); } } free(l); l = NULL; return 0; }

得分 100
學習任務

史啦啦 的學生作業:

【圖片】 #include #include #include #include #include /* See NOTES */ #include #include #include #define LISTEN_SZ 10 int main(int argc,char *argv[]) { int sfd,ret,cfd; struct sockaddr_in svr_addr,cli_addr; ssize_t sbytes = 0,rbytes = 0; char buffer[1024] = {0}; int length; int total_received; socklen_t len = sizeof(struct sockaddr_in); 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(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); } bzero(&cli_addr,sizeof(struct sockaddr_in)); 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; total_received = 0; //接收數據的長度 rbytes = recv(cfd,&length,4,0); if(rbytes == -1) { perror("[ERROR] Failed to recv."); exit(EXIT_FAILURE); } for(;;) { rbytes = recv(cfd,buffer + total_received,length - total_received,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) { total_received += rbytes; if(total_received == length) { break; } } } printf("buffer : %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] = "Hello,server"; int length = 0; 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); } 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 (sbytes == -1){ perror("[ERROR] send(): "); exit(EXIT_FAILURE); } usleep(100); } close(sfd); return 0; }

得分 100
學習任務

cjozGV 的學生作業:

#include "stdio.h" #include "string.h" #include "stdlib.h" #define MAX 10 struct student{ char name[20]; int id; int age; }; typedef struct student datatype_t; typedef struct { datatype_t buf[MAX]; //定義數組記錄班級學生每個學生的信息。 int n; //學生實際到來的個數。 }SeqList; //1.創建順序表 SeqList* create_empty_seqlist(){ //1.聲明指針并初始化為NULL SeqList *l = NULL; //2.在堆區分配內存 l = (SeqList*)malloc(sizeof(SeqList)); //3.檢查malloc是否成功 if (NULL == l){ printf("malloc is fail!\n"); return NULL; } //4.初始化內存 memset(l,0, sizeof(SeqList)); //5.顯示初始化關鍵成員 l->n = 0; return l; } //2.檢查順序表是否已滿 int is_full_seqlist(SeqList *l){ //檢查指針是否有效 if (NULL == l){ printf("error: seqlist_t pointer is NUlL.\n"); return 1; //返回已滿阻止后續操作 } //判斷是否已滿 return (l->n >=MAX) ? 1:0; } //3.插入學生數據 void insert_data_seqlist(SeqList *l,datatype_t data){ if (NULL == l || is_full_seqlist(l)){ return; } l->buf[l->n++] = data; } //4.輸出數據 void printf_data_seqlist(SeqList *l){ if(NULL == l){ return; } for (int i = 0; i < l->n; i++) { printf("Student %d:Name: %s, ID: %d, Age: %d\n", i+1,l->buf[i].name,l->buf[i].id,l->buf[i].age); } printf("----------------------------\n\n"); } int main(){ SeqList* l = create_empty_seqlist(); if (NULL == l){ return -1; } datatype_t data; printf("please input %d number : ",MAX); //滿了只取前十 while (!is_full_seqlist(l)){ printf("Student %d: ",l->n + 1); if (scanf("%s %d %d",data.name,&data.id,&data.age) != 3){ printf("Input error! Please enter name, id and age.\n"); //清除緩沖區 while (getchar() != '\n'); continue; } insert_data_seqlist(l,data); printf_data_seqlist(l); } // 釋放內存(雖然這里順序表是局部變量,但如果是動態分配的需手動釋放) free(l); l = NULL; //避免懸空指針 return 0; }

得分 100
學習任務

慕尼黑0001808 的學生作業:

/* 練習 int a[2][3] = {10,20,30,40,50,60}; int (*p)[3] = a; 要求通過多種方式輸出a數組中的數據 */ /* 個人總結: 指針與數組有很高的相似性(基本數據類型變量的指針,可以理解為一維一個元素的數組): 都是引用類型;* 都是用來取下級的0索引值;[] 都是用來取下級指定索引值;& 取本身的地址值;它們各級代表的數據類型相同;各級相同數據類型的偏移量是相同的。 數組取索引越界報錯,指針取索引越界不會報錯;它們的聲明語法結構不同,數組聲明:int a[3][2],指針:int (*p)[2];指針沒有實際的數據,它需要依賴于變量來產生數,數組中有實際的數據。 */ #include int main() { int a[2][3] = {10,20,30,40,50,60}; int (*p)[3] = a; printf("a=%p\n",a); printf("a[0]=%p\n",a[0]); printf("&a=%p\n",&a); printf("&a[0]=%p\n",&a[0]); printf("*a=%p\n",*a); printf("**a=%d\n",**a); printf("========================================\n"); printf("sizeof(a)=%d\n",sizeof(a)); printf("sizeof(a[0])=%d\n",sizeof(a[0])); printf("sizeof(&a)=%d\n",sizeof(&a)); printf("sizeof(&a[0])=%d\n",sizeof(&a[0])); for(int i = 0;i < 2;i++) { for(int j = 0;j < 3;j++) { printf("==============================================\n"); printf("a[%d][%d]=%d\n",i,j,a[i][j]); printf("(*(a+%d))[%d]=%d\n",i,j,(*(a+i))[j]); printf("*(a[%d]+%d)=%d\n",i,j,*(a[i]+j)); printf("*(*(a+%d)+%d)=%d\n",i,j,*(*(a+i)+j)); printf("p[%d][%d]=%d\n",i,j,p[i][j]); printf("*(p[%d]+%d)=%d\n",i,j,*(p[i]+j)); printf("*(*(p+%d))+%d)=%d\n",i,j,*(*(p+i)+j)); } } return 0; }

得分 100
學習任務

史啦啦 的學生作業:

TCP 面向流的傳輸特性 TCP 協議本身是無消息邊界的字節流傳輸協議。發送方的數據在傳輸層會被拆分成多個 TCP 段(Segment),接收方重組時僅保證字節順序,不保留原始數據包的劃分邊界。 發送端優化機制 Nagle 算法:為減少小數據包的網絡開銷,發送端會合并多個小數據包(如多次 send() 調用)再發送。 緩沖區機制:應用層的數據先寫入發送緩沖區,若緩沖區未滿或未超時,可能延遲發送導致數據堆積?!緢D片】 #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; 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; } #include #include #include #include #include #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; }

得分 100
學習任務

史啦啦 的學生作業:

【圖片】 #include #include #include #include #include #include #include #include #define LISTEN_SZ 10 int main(int argc,char *argv[]) { if(argc != 3) { fprintf(stderr,"Usage : %s .\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)); //接收客戶端的數據 while(1) { memset(buffer,0,sizeof(buffer)); rbytes = recv(cfd,buffer,sizeof(buffer),0); if(rbytes == -1) { perror("[ERROR] recv():"); exit(EXIT_FAILURE); } else if(rbytes == 0) { printf("The client is offline.\n"); exit(EXIT_FAILURE); } else if(rbytes > 0) { //接收到客戶端數據回傳給客戶端 sbytes = send(cfd,buffer,sizeof(buffer),0); if(sbytes == -1) { perror("[ERROR] send():"); exit(EXIT_FAILURE); } } if(strncmp(buffer,"quit",4) == 0) { break; } } return 0; }

得分 100
學習任務

Hee_cryLQ0 的學生作業:

seqlist.h #ifndef __SEQLIST__ #define __SEQLIST__ #include #include #include #define MAX 10 typedef struct student { char name[20]; int id; int age; }datatype_t; typedef struct { datatype_t buf[MAX]; //buf[10]:順序表中有10個學生 int n; }seqlist_t; seqlist_t *create_empty_seqlist(); int is_full_seqlist(seqlist_t *list); void insert_data_seqlist(seqlist_t *list, datatype_t data); void printf_data_seqlist(seqlist_t *list); #endif //__SEQLIST__ seqlist.c #include "seqlist.h" /*創建一個空的順序表*/ seqlist_t *create_empty_seqlist() { seqlist_t *list = NULL; //list本身是局部變量 list = (seqlist_t *)malloc(sizeof(seqlist_t));//而list保存的地址在堆區 if(NULL == list) { printf("malloc seqlist failed!\n"); return NULL; } memset(list, 0, sizeof(seqlist_t)); list->n = 0; return list; } /*檢查順序表是否已經存滿數據MAX=10*/ int is_full_seqlist(seqlist_t *list) { return list->n == MAX ? 1 : 0; } /*向順序表中插入學生信息,傳入學生對象data*/ void insert_data_seqlist(seqlist_t *list, datatype_t data) { strcpy(list->buf[list->n].name, data.name);//數組名是數組首地址,不能對數組名進行=賦值,所以需要使用strcpy list->buf[list->n].id = data.id; list->buf[list->n].age = data.age; list->n = list->n + 1; //list->n++; return ; } /*打印順序表中的學生信息*/ void printf_data_seqlist(seqlist_t *list) { printf("name\tid\tage\n"); for(int i = 0; i < list->n; i++) { printf("%s\t%d\t%d\n",list->buf[i].name, list->buf[i].id, list->buf[i].age); } return ; } main.c #include "seqlist.h" int main() { seqlist_t *list = NULL; list = create_empty_seqlist();//創建一個空表 datatype_t data; //創建學生對象 printf("請輸入學生的信息,最多輸入%d個。\n", MAX); while(!is_full_seqlist(list)) { scanf("%s%d%d", data.name, &data.id, &data.age); insert_data_seqlist(list, data); } printf_data_seqlist(list); free(list); list = NULL; return 0; }

微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號