第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定

作業(yè)社區(qū)

探索學(xué)習(xí)新天地,共享知識(shí)資源!

0 提交作業(yè)
0個(gè) 布置作業(yè)
0 滿(mǎn)分作業(yè)
得分 100
學(xué)習(xí)任務(wù)

浪潮君 的學(xué)生作業(yè):

#include #include #include #include #include // ---------------- 全局變量與同步機(jī)制 ---------------- // // 共享資源:產(chǎn)品庫(kù)存數(shù)量 static int number = 0; // 所有生產(chǎn)者計(jì)劃生產(chǎn)的總產(chǎn)品數(shù)量 static int total_of_produce = 0; // 當(dāng)前已消費(fèi)產(chǎn)品數(shù)量 static int total_of_consume = 0; // 互斥鎖和條件變量,確保線程安全與同步 static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; static pthread_cond_t cond = PTHREAD_COND_INITIALIZER; // ---------------- 結(jié)構(gòu)體定義:生產(chǎn)者線程參數(shù) ---------------- // typedef struct { int count; // 當(dāng)前線程要生產(chǎn)的產(chǎn)品數(shù)量 int id; // 當(dāng)前線程編號(hào) } ProducerArg; // ---------------- 線程函數(shù):生產(chǎn)者 ---------------- // void *producer_thread(void *arg) { ProducerArg *parg = (ProducerArg *)arg; for (int i = 0; i < parg->count; i++) { pthread_mutex_lock(&mutex); // 加鎖,進(jìn)入臨界區(qū) number++; // 增加產(chǎn)品庫(kù)存 printf("生產(chǎn)者[%d] 生產(chǎn)了一個(gè)產(chǎn)品,總庫(kù)存:%d\n", parg->id, number); pthread_cond_signal(&cond); // 通知一個(gè)等待中的消費(fèi)者 pthread_mutex_unlock(&mutex); // 解鎖,離開(kāi)臨界區(qū) usleep(rand() % 500000); // 模擬生產(chǎn)耗時(shí)(隨機(jī)延遲) } free(parg); // 釋放參數(shù)結(jié)構(gòu)體內(nèi)存 return NULL; } // ---------------- 主函數(shù):創(chuàng)建線程 + 主線程做消費(fèi)者 ---------------- // int main(int argc, char *argv[]) { if (argc < 2) { fprintf(stderr, "用法: %s ...\n", argv[0]); return EXIT_FAILURE; } int num_producers = argc - 1; pthread_t tids[num_producers]; // 存儲(chǔ)每個(gè)生產(chǎn)者線程的ID // 創(chuàng)建生產(chǎn)者線程 for (int i = 0; i < num_producers; i++) { char *endptr = NULL; long val = strtol(argv[i + 1], &endptr, 10); if (*endptr != '\0' || val count = count; parg->id = i + 1; if (pthread_create(&tids[i], NULL, producer_thread, parg) != 0) { perror("線程創(chuàng)建失敗"); free(parg); return EXIT_FAILURE; } } // ---------------- 主線程作為消費(fèi)者 ---------------- // while (true) { pthread_mutex_lock(&mutex); // 如果庫(kù)存為 0,則阻塞等待生產(chǎn)者 signal while (number == 0) { pthread_cond_wait(&cond, &mutex); } // 有產(chǎn)品可消費(fèi) number--; total_of_consume++; printf("消費(fèi)者 消費(fèi)了一個(gè)產(chǎn)品,剩余庫(kù)存:%d\n", number); bool done = (total_of_consume >= total_of_produce); pthread_mutex_unlock(&mutex); sleep(1); // 模擬消費(fèi)時(shí)間 if (done) { break; // 所有產(chǎn)品已消費(fèi)完畢,退出循環(huán) } } // 等待所有生產(chǎn)者線程結(jié)束 for (int i = 0; i < num_producers; i++) { pthread_join(tids[i], NULL); } // 銷(xiāo)毀同步原語(yǔ) pthread_mutex_destroy(&mutex); pthread_cond_destroy(&cond); printf("所有產(chǎn)品已被消費(fèi)完畢,共消費(fèi):%d 個(gè)\n", total_of_consume); return 0; }

得分 100
學(xué)習(xí)任務(wù)

胡漢三66 的學(xué)生作業(yè):

#include #include #include #include // bzore() #include // close() #include #include #include #include #include #include #include // pthread_creat() #define BACKLOG 10 // 監(jiān)聽(tīng)隊(duì)列最大值 void *do_process_client(void *arg){ // 子線程函數(shù) ssize_t rbytes = 0,sbytes = 0; char buffer[1024] = {0}; int cfd = *(int *)arg; // 獲取 客戶(hù)端套接字 文件描述符 for(;;){ rbytes = recv(cfd,buffer,sizeof(buffer),0); if(rbytes == -1){ perror("[ERROR] Failed to recv."); pthread_exit(NULL); // 退出當(dāng)前線程 }else if(rbytes > 0){ // 如果收到數(shù)據(jù) sbytes = send(cfd,buffer,strlen(buffer),0); if(sbytes == -1){ perror("[ERROR] Failed to socket."); pthread_exit(NULL); // 退出當(dāng)前線程 } }else if(rbytes == 0){ printf("The client has been shutdown.\n"); break; } } close(cfd); pthread_exit(NULL); // 退出當(dāng)前線程 } // TCP服務(wù)器連接 // ./a.out ip port int main(int argc, const char *argv[]) { int sfd,ret,cfd; struct sockaddr_in svr_addr,cli_addr; pthread_t tid; // 子線程ID int length; socklen_t len = sizeof(struct sockaddr_in); if(argc != 3){ fprintf(stderr,"Usage : %s < ip > < port >.\n",argv[0]); exit(EXIT_FAILURE); } // 1.創(chuàng)建套接字 sfd = socket(AF_INET,SOCK_STREAM,0); if(sfd == -1){ perror("[ERROR] Failed to socket."); exit(EXIT_FAILURE); } printf("sfd = %d\n",sfd); bzero(&svr_addr,sizeof(struct sockaddr_in)); // 指針指向空間初始化(清零) svr_addr.sin_family = AF_INET; // 協(xié)議族 svr_addr.sin_port = htons(atoi(argv[2])); // 端口 svr_addr.sin_addr.s_addr = inet_addr(argv[1]); // IP // 2.綁定ip地址與端口號(hào) ret = bind(sfd,(const struct sockaddr *)&svr_addr,sizeof(struct sockaddr_in)); if(ret == -1){ perror("[ERROR] Failed to bind."); exit(EXIT_FAILURE); } // 3.建立監(jiān)聽(tīng)隊(duì)列 ret = listen(sfd,BACKLOG); if(ret == -1){ perror("[ERROR] Failed to listen."); exit(EXIT_FAILURE); } for(;;){ // 4.建立連接,并產(chǎn)生新的客戶(hù)端用于數(shù)據(jù)收發(fā) 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); // 分離子線程 // 程序結(jié)束時(shí),系統(tǒng)會(huì)釋放子線程資源 } close(sfd); // 關(guān)閉 文件描述符 return 0; } 【圖片】

得分 100
學(xué)習(xí)任務(wù)

浪潮君 的學(xué)生作業(yè):

#include #include #include #include // 全局變量,所有線程共享,用于計(jì)數(shù) static int global = 0; // 互斥鎖,用于保護(hù)對(duì) global 的并發(fā)訪問(wèn) pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; // 線程函數(shù):每個(gè)線程執(zhí)行 loops 次 global++ void *do_thread(void *arg) { // 將通用指針 arg 轉(zhuǎn)換為 int*,再解引用取值 int loops = *(int *) arg; // 每次循環(huán)加鎖、修改 global、解鎖 for (int i = 0; i < loops; i++) { pthread_mutex_lock(&mutex); // 加鎖,防止其他線程同時(shí)訪問(wèn) global global++; // 累加全局變量 pthread_mutex_unlock(&mutex); // 解鎖,允許其他線程進(jìn)入 } return NULL; // 返回 NULL 表示無(wú)返回值 } int main(int argc, char *argv[]) { // ---------------- 參數(shù)校驗(yàn)開(kāi)始 ---------------- // 程序需要一個(gè)參數(shù),作為每個(gè)線程的循環(huán)次數(shù) if (argc != 2) { fprintf(stderr, "參數(shù)錯(cuò)誤!\n"); fprintf(stderr, "用法:%s \n", argv[0]); fprintf(stderr, "示例:%s 100000\n", argv[0]); fprintf(stderr, "說(shuō)明:必須傳入一個(gè)正整數(shù)作為參數(shù),表示每個(gè)線程執(zhí)行的加法次數(shù)。\n"); exit(EXIT_FAILURE); } // ---------------- 參數(shù)解析(strtol 更安全) ---------------- char *endptr = NULL; // 將字符串轉(zhuǎn)換為 long 類(lèi)型,支持輸入較大的數(shù)字 long val = strtol(argv[1], &endptr, 10); // base 10 表示十進(jìn)制 // 檢查是否為純數(shù)字,是否為正數(shù) if (*endptr != '\0' || val

得分 100
學(xué)習(xí)任務(wù)

浪潮君 的學(xué)生作業(yè):

#include #include #include #include // 定義一個(gè)結(jié)構(gòu)體 Person,包含名字和年齡 typedef struct { char name[20]; int age; } Person; // 子線程的函數(shù),用于創(chuàng)建并返回一個(gè)結(jié)構(gòu)體指針 void *thread_func(void *) { // 動(dòng)態(tài)分配結(jié)構(gòu)體內(nèi)存(分配到堆上,避免線程棧退出后失效) Person *p = malloc(sizeof(*p)); if (NULL == p) { perror("malloc failed"); pthread_exit(NULL); // 分配失敗時(shí),線程安全退出 } // 初始化結(jié)構(gòu)體數(shù)據(jù) strcpy(p->name, "Tom"); p->age = 28; // 將結(jié)構(gòu)體指針作為線程返回值傳遞回主線程 return p; } int main(int argc, char *argv[]) { pthread_t tid; // 線程 ID Person *result = NULL; // 用于接收子線程返回的結(jié)構(gòu)體指針 // 創(chuàng)建子線程,執(zhí)行 thread_func 函數(shù) if (pthread_create(&tid, NULL, thread_func, NULL) != 0) { perror("線程創(chuàng)建失敗"); exit(EXIT_FAILURE); } // 等待子線程結(jié)束,并獲取返回值(結(jié)構(gòu)體指針) if (pthread_join(tid, (void **)&result) != 0) { perror("pthread_join"); exit(EXIT_FAILURE); } // 打印結(jié)構(gòu)體內(nèi)容(驗(yàn)證子線程傳遞的數(shù)據(jù)) if (result != NULL) { printf("姓名:%s\n", result->name); printf("年齡:%d\n", result->age); } // 釋放堆內(nèi)存,防止內(nèi)存泄漏 free(result); return 0; }

得分 100
學(xué)習(xí)任務(wù)

浪潮君 的學(xué)生作業(yè):

#include #include #include #include // 線程A的函數(shù) void *thread_A(void *arg) { for (int i = 0; i < 3; i++) { printf("線程A:第 %d 次執(zhí)行\(zhòng)n", i + 1); sleep(1); // 模擬耗時(shí)操作 } pthread_exit(NULL); // 顯式退出線程(可省略) } // 線程B的函數(shù) void *thread_B(void *arg) { for (int i = 0; i < 3; i++) { printf("線程B:第 %d 次執(zhí)行\(zhòng)n", i + 1); sleep(1); // 模擬耗時(shí)操作 } pthread_exit(NULL); } int main() { pthread_t tid_A, tid_B; // 聲明兩個(gè)線程ID // 創(chuàng)建線程A if (pthread_create(&tid_A, NULL, thread_A, NULL) != 0) { perror("創(chuàng)建線程A失敗"); exit(EXIT_FAILURE); } // 創(chuàng)建線程B if (pthread_create(&tid_B, NULL, thread_B, NULL) != 0) { perror("創(chuàng)建線程B失敗"); exit(EXIT_FAILURE); } // 設(shè)置線程A、B為分離狀態(tài): // 一旦線程執(zhí)行完,系統(tǒng)自動(dòng)釋放資源,不需要主線程回收 pthread_detach(tid_A); pthread_detach(tid_B); // 因?yàn)榫€程是分離狀態(tài),主線程不能使用 join 來(lái)等待它們 // 為防止主線程提前退出,我們 sleep 一段時(shí)間,確保子線程有時(shí)間完成 sleep(5); // 等待足夠的時(shí)間(3次sleep(1) ≈ 3秒,預(yù)留2秒緩沖) printf("主線程結(jié)束(不等待子線程)\n"); return 0; }

得分 100
學(xué)習(xí)任務(wù)

胡漢三66 的學(xué)生作業(yè):

client.c #include #include #include #include // bzore() #include // close() #include #include #include #include // TCP客戶(hù)端連接 // ./a.out ip port int main(int argc, const char *argv[]) { int sfd,ret; ssize_t sbytes = 0; char buffer[1024] = "Hello,server"; char *pbuffer = NULL; int length = 0; struct sockaddr_in svr_addr; if(argc != 3){ fprintf(stderr,"Usage : %s < ip > < port >.\n",argv[0]); exit(EXIT_FAILURE); } // 1.創(chuàng)建套接字 sfd = socket(AF_INET,SOCK_STREAM,0); if(sfd == -1){ perror("[ERROR] Failed to socket."); exit(EXIT_FAILURE); } // 2.建立連接 bzero(&svr_addr,sizeof(struct sockaddr_in)); // 指針指向空間初始化(清零) svr_addr.sin_family = AF_INET; // 協(xié)議族 svr_addr.sin_port = htons(atoi(argv[2])); // 端口 svr_addr.sin_addr.s_addr = inet_addr(argv[1]); // IP ret = connect(sfd,(const struct sockaddr *)&svr_addr,sizeof(struct sockaddr_in)); // 客戶(hù)端 連接 服務(wù)器 if(ret == -1){ perror("[ERROR] Failed to connect."); exit(EXIT_FAILURE); } for(;;){ // 循環(huán)輸入發(fā)送 length = strlen(buffer); pbuffer = (char *)malloc(length + 4); memcpy(pbuffer,&length,4); // 存儲(chǔ)字節(jié)數(shù) memcpy(pbuffer + 4,buffer,length); // 存儲(chǔ)數(shù)據(jù)內(nèi)容 sbytes = send(sfd,pbuffer,length + 4,0); if(sbytes == -1){ perror("[ERROR] Failed to send."); exit(EXIT_FAILURE); } usleep(100); // 休息100微妙 // 100微妙 = 0.0001秒 } close(sfd); // 關(guān)閉 文件描述符 return 0; } server.c #include #include #include #include // bzore() #include // close() #include #include #include #include #define BACKLOG 10 // 監(jiān)聽(tīng)隊(duì)列最大值 // TCP服務(wù)器連接 // ./a.out ip port int main(int argc, const char *argv[]) { int sfd,ret,cfd; struct sockaddr_in svr_addr,cli_addr; ssize_t rbytes = 0,sbytes = 0; char buffer[1024] = {0}; int length; int total_received; // 統(tǒng)計(jì)當(dāng)前接收的總字節(jié)數(shù) socklen_t len = sizeof(struct sockaddr_in); if(argc != 3){ fprintf(stderr,"Usage : %s < ip > < port >.\n",argv[0]); exit(EXIT_FAILURE); } // 1.創(chuàng)建套接字 sfd = socket(AF_INET,SOCK_STREAM,0); if(sfd == -1){ perror("[ERROR] Failed to socket."); exit(EXIT_FAILURE); } printf("sfd = %d\n",sfd); bzero(&svr_addr,sizeof(struct sockaddr_in)); // 指針指向空間初始化(清零) svr_addr.sin_family = AF_INET; // 協(xié)議族 svr_addr.sin_port = htons(atoi(argv[2])); // 端口 svr_addr.sin_addr.s_addr = inet_addr(argv[1]); // IP // 2.綁定ip地址與端口號(hào) ret = bind(sfd,(const struct sockaddr *)&svr_addr,sizeof(struct sockaddr_in)); if(ret == -1){ perror("[ERROR] Failed to bind."); exit(EXIT_FAILURE); } // 3.建立監(jiān)聽(tīng)隊(duì)列 ret = listen(sfd,BACKLOG); if(ret == -1){ perror("[ERROR] Failed to listen."); exit(EXIT_FAILURE); } // 4.建立連接,并產(chǎn)生新的客戶(hù)端用于數(shù)據(jù)收發(fā) 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)); for(;;){ length = 0; int total_received = 0; // 統(tǒng)計(jì)當(dāng)前接收的總字節(jié)數(shù) 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){ // 如果收到數(shù)據(jù) total_received += rbytes; if(total_received == length) break; }else if(rbytes == 0){ printf("The client has been shutdown.\n"); break; } } printf("buffer : %s\n",buffer); sleep(1); // 休息1秒 } close(sfd); // 關(guān)閉 文件描述符 close(cfd); return 0; } 【圖片】

得分 100
學(xué)習(xí)任務(wù)

浪潮君 的學(xué)生作業(yè):

#include #include #include #include #include // 定義一個(gè)結(jié)構(gòu)體,封裝兩個(gè)命名信號(hào)量的指針,便于統(tǒng)一管理和傳遞 typedef struct { sem_t *sem_zero; // 信號(hào)量1,初始值為 0,常用于“等待條件滿(mǎn)足” sem_t *sem_one; // 信號(hào)量2,初始值為 1,常用于“互斥訪問(wèn)”或資源令牌 } SemaphoreSet; int main() { SemaphoreSet semaphores; // 聲明信號(hào)量集合結(jié)構(gòu)體變量 // 使用 sem_open 創(chuàng)建命名信號(hào)量: // 參數(shù)含義: // - 名字以 / 開(kāi)頭(是 POSIX 命名要求) // - O_CREAT | O_EXCL 表示“如果已存在則報(bào)錯(cuò)” // - 0644 是文件權(quán)限 // - 最后一個(gè)參數(shù)是初始值 semaphores.sem_zero = sem_open("/sem_zero", O_CREAT | O_EXCL, 0644, 0); // 初始為 0 semaphores.sem_one = sem_open("/sem_one", O_CREAT | O_EXCL, 0644, 1); // 初始為 1 // 錯(cuò)誤檢查:如果 sem_zero 創(chuàng)建失敗,立即退出 if (semaphores.sem_zero == SEM_FAILED) { perror("sem_open sem_zero failed"); exit(EXIT_FAILURE); } // 錯(cuò)誤檢查:如果 sem_one 創(chuàng)建失敗,釋放 sem_zero 并退出(回滾清理) if (semaphores.sem_one == SEM_FAILED) { perror("sem_open sem_one failed"); sem_close(semaphores.sem_zero); // 關(guān)閉 sem_zero 引用 sem_unlink("/sem_zero"); // 刪除系統(tǒng)中的 sem_zero 信號(hào)量 exit(EXIT_FAILURE); } // 如果兩個(gè)信號(hào)量都成功創(chuàng)建,打印提示信息 printf("命名信號(hào)量集合已初始化:/sem_zero = 0, /sem_one = 1\n"); // 關(guān)閉兩個(gè)信號(hào)量的引用(釋放當(dāng)前進(jìn)程持有的句柄) sem_close(semaphores.sem_zero); sem_close(semaphores.sem_one); // 刪除命名信號(hào)量,釋放系統(tǒng)內(nèi)核資源 sem_unlink("/sem_zero"); sem_unlink("/sem_one"); return 0; }

得分 100
學(xué)習(xí)任務(wù)

胡漢三66 的學(xué)生作業(yè):

1.粘包原因:底層邏輯:TCP協(xié)議子啊底層是字節(jié)流,并不關(guān)注應(yīng)用層的消息邊界。具體分兩類(lèi)發(fā)送方和接收方. 1-1. 發(fā)送方一: 發(fā)送多個(gè)較小數(shù)據(jù)包,一般是小于內(nèi)核緩沖區(qū)大小。默認(rèn)情況下,tcp采用Nagle算法,會(huì)合并連續(xù)的小數(shù)據(jù)包一次性發(fā)送,形成粘包。 1-2. 發(fā)送方二: 發(fā)送一個(gè)大數(shù)據(jù)包,大數(shù)據(jù)包大于MTU(最大輸出單元),會(huì)發(fā)生拆包,將字節(jié)流進(jìn)行切片分成多個(gè)包進(jìn)行發(fā)送,拆分后的大數(shù)據(jù)包形成粘包。 2. 接收方: 客戶(hù)端發(fā)送的速度大于服務(wù)器接收的速度,在緩沖區(qū)緩存了多個(gè)數(shù)據(jù)包,服務(wù)器一次性讀取,則會(huì)讀取多個(gè)數(shù)據(jù)包,也就是粘包。 client.c #include #include #include #include // bzore() #include // close() #include #include #include #include // TCP客戶(hù)端連接 // ./a.out ip port int main(int argc, const char *argv[]) { int sfd,ret; ssize_t sbytes = 0, rbytes = 0; char buffer[1024] = {0}; struct sockaddr_in svr_addr; if(argc != 3){ fprintf(stderr,"Usage : %s < ip > < port >.\n",argv[0]); exit(EXIT_FAILURE); } // 1.創(chuàng)建套接字 sfd = socket(AF_INET,SOCK_STREAM,0); if(sfd == -1){ perror("[ERROR] Failed to socket."); exit(EXIT_FAILURE); } // 2.建立連接 bzero(&svr_addr,sizeof(struct sockaddr_in)); // 指針指向空間初始化(清零) svr_addr.sin_family = AF_INET; // 協(xié)議族 svr_addr.sin_port = htons(atoi(argv[2])); // 端口 svr_addr.sin_addr.s_addr = inet_addr(argv[1]); // IP ret = connect(sfd,(const struct sockaddr *)&svr_addr,sizeof(struct sockaddr_in)); // 客戶(hù)端 連接 服務(wù)器 if(ret == -1){ perror("[ERROR] Failed to connect."); exit(EXIT_FAILURE); } for(;;){ // 循環(huán)輸入發(fā)送 // 獲取數(shù)據(jù) strcpy(buffer,"Hello,server"); // 3.發(fā)送數(shù)據(jù) (客戶(hù)端-->服務(wù)器) sbytes = send(sfd,buffer,strlen(buffer),0); // "+1" ---> "\0" if(sbytes == -1){ perror("[ERROR] Failed to send."); exit(EXIT_FAILURE); } usleep(100); // 休息100微妙 // 100微妙 = 0.0001秒 } close(sfd); // 關(guān)閉 文件描述符 return 0; } server.c #include #include #include #include // bzore() #include // close() #include #include #include #include #define BACKLOG 10 // 監(jiān)聽(tīng)隊(duì)列最大值 // TCP服務(wù)器連接 // ./a.out ip port int main(int argc, const char *argv[]) { int sfd,ret,cfd; struct sockaddr_in svr_addr,cli_addr; ssize_t rbytes = 0,sbytes = 0; char buffer[1024] = {0}; socklen_t len = sizeof(struct sockaddr_in); if(argc != 3){ fprintf(stderr,"Usage : %s < ip > < port >.\n",argv[0]); exit(EXIT_FAILURE); } // 1.創(chuàng)建套接字 sfd = socket(AF_INET,SOCK_STREAM,0); if(sfd == -1){ perror("[ERROR] Failed to socket."); exit(EXIT_FAILURE); } printf("sfd = %d\n",sfd); bzero(&svr_addr,sizeof(struct sockaddr_in)); // 指針指向空間初始化(清零) svr_addr.sin_family = AF_INET; // 協(xié)議族 svr_addr.sin_port = htons(atoi(argv[2])); // 端口 svr_addr.sin_addr.s_addr = inet_addr(argv[1]); // IP // 2.綁定ip地址與端口號(hào) ret = bind(sfd,(const struct sockaddr *)&svr_addr,sizeof(struct sockaddr_in)); if(ret == -1){ perror("[ERROR] Failed to bind."); exit(EXIT_FAILURE); } // 3.建立監(jiān)聽(tīng)隊(duì)列 ret = listen(sfd,BACKLOG); if(ret == -1){ perror("[ERROR] Failed to listen."); exit(EXIT_FAILURE); } // 4.建立連接,并產(chǎn)生新的客戶(hù)端用于數(shù)據(jù)收發(fā) 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)); for(;;){ memset(buffer,0,sizeof(buffer)); // 清空 rbytes = recv(cfd,buffer,sizeof(buffer),0); if(rbytes == -1){ perror("[ERROR] Failed to recv."); exit(EXIT_FAILURE); }else if(rbytes > 0){ // 如果收到數(shù)據(jù) printf("buffer : %s\n",buffer); }else if(rbytes == 0){ printf("The client has been shutdown.\n"); break; } sleep(1); // 休息1秒 } close(sfd); // 關(guān)閉 文件描述符 close(cfd); return 0; } 【圖片】

微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)