日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

一对经典的时间获取客户/服务器程序

發(fā)布時(shí)間:2023/12/9 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 一对经典的时间获取客户/服务器程序 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前言

  本文通過一對(duì)經(jīng)典的時(shí)間獲取客戶/服務(wù)器程序,展現(xiàn)了Linux網(wǎng)絡(luò)編程的大體框架,為以后更深入的學(xué)習(xí)打下基礎(chǔ)。

客戶服務(wù)器模式網(wǎng)絡(luò)編程的大體框架

客戶端代碼

1 #include <stdio.h> 2 // 下頭文件包含socket(), bind()等套接字通信必須的函數(shù)。 3 #include <sys/socket.h> 4 // 下頭文件包含網(wǎng)際套接字變量的類型定義等。 5 #include <netinet/in.h> 6 // 下頭文件包含bzero()函數(shù)等 7 #include <string.h> 8 // 下頭文件包含errno變量等 9 #include <errno.h> 10 11 #define MAXLINE 100 12 13 int main (int argc, char ** argv) 14 { 15 // 定義套接字描述符變量sockfd 16 // 定義變量n存放read函數(shù)返回值 17 int sockfd, n; 18 // 定義字符數(shù)組recvline存放時(shí)間查詢結(jié)果 19 char recvline[MAXLINE + 1]; 20 // 定義套接字變量servaddr( 注意這里存放的是服務(wù)器端的信息 ) 21 struct sockaddr_in servaddr; 22 23 // 檢查命令格式是否正確 24 if (argc != 2) { 25 puts("命令格式錯(cuò)誤\n"); 26 return 1; 27 } 28 29 // 創(chuàng)建一個(gè)網(wǎng)際字節(jié)流套接字 30 if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) <0) { 31 puts("網(wǎng)際套接字創(chuàng)建失敗\n"); 32 return 2; 33 } 34 35 // 將套接字變量servaddr清零 36 bzero(&servaddr, sizeof(servaddr)); 37 // 給套接字變量的協(xié)議段賦值( AF_INET表示IPv4協(xié)議 ) 38 servaddr.sin_family = AF_INET; 39 // 給套接字變量的端口段賦值( 13是時(shí)間服務(wù)器端口 ) 40 servaddr.sin_port = htons(13); 41 // 給套接字變量的IP段賦值( argv[1]存放服務(wù)器IP ) 42 if (inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0) { 43 puts("IP地址格式轉(zhuǎn)換失敗"); 44 return 3; 45 } 46 47 // 按照先前socket函數(shù)指定的協(xié)議類型與服務(wù)器進(jìn)行連接 48 if (connect(sockfd, (struct sockaddr *) &servaddr, sizeof(servaddr)) < 0) { 49 puts("連接失敗\n"); 50 return 4; 51 } 52 53 // 從緩沖區(qū)讀取時(shí)間查詢結(jié)果并放進(jìn)recvline數(shù)組中 54 if ( (n = read(sockfd, recvline, MAXLINE)) > 0 ) { 55 recvline[n] = 0; 56 puts(recvline); 57 } 58 if (n < 0) { 59 puts("讀取數(shù)據(jù)發(fā)生錯(cuò)誤"); 60 } 61 62 return 0; 63 }

服務(wù)器端代碼

1 #include <stdio.h> 2 3 // 下頭文件包含socket(), bind()等套接字通信必須的函數(shù)。 4 #include <sys/socket.h> 5 // 下頭文件包含網(wǎng)際套接字變量的類型定義等。 6 #include <netinet/in.h> 7 // 下頭文件包含bzero()函數(shù)等 8 #include <string.h> 9 // 下頭文件包含errno變量等 10 #include <errno.h> 11 // 下頭文件包含一些時(shí)間函數(shù) 12 #include <time.h> 13 14 #define MAXLINE 100 15 #define LISTENQ 5 16 17 int main(int argc, char **argv) 18 { 19 // 定義監(jiān)聽套接字描述符listenfd 20 // 定義連接套接字描述符 21 int listenfd, connfd; 22 // 定義套接字變量servaddr( 注意這里存放的是客戶端的信息 ) 23 struct sockaddr_in servaddr; 24 // 定義字符數(shù)組buff暫存時(shí)間 25 char buff[MAXLINE]; 26 27 // 定義時(shí)間相關(guān)變量 28 time_t ticks; 29 struct tm *ptm; 30 31 // 創(chuàng)建一個(gè)網(wǎng)際字節(jié)流套接字 32 if ((listenfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { 33 puts("創(chuàng)建網(wǎng)際套接字失敗\n"); 34 return 1; 35 } 36 37 // 將套接字變量servaddr清零 38 bzero(&servaddr, sizeof(servaddr)); 39 // 給套接字變量的協(xié)議段賦值( AF_INET表示IPv4協(xié)議 ) 40 servaddr.sin_family = AF_INET; 41 // 給套接字變量的端口段賦值( 13是時(shí)間服務(wù)器端口 ) 42 servaddr.sin_addr.s_addr = htonl(INADDR_ANY); 43 // 給套接字變量的IP段賦值( argv[1]存放服務(wù)器IP ) 44 servaddr.sin_port = htons(13); 45 46 // 把指定的協(xié)議地址綁定到套接字 47 if (bind(listenfd, (struct sockaddr *) &servaddr, sizeof(servaddr)) < 0 ) { 48 puts("綁定服務(wù)端口失敗\n"); 49 return 2; 50 } 51 // 將套接字轉(zhuǎn)換為監(jiān)聽套接字類型 52 if (listen(listenfd, LISTENQ) < 0) { 53 puts("創(chuàng)建監(jiān)聽套接字失敗\n"); 54 return 3; 55 } 56 57 while (1) { 58 // 等待客戶呼叫,若收到呼叫則返回一個(gè)已連接套接字。 59 connfd = accept(listenfd, (struct sockaddr *)NULL, NULL); 60 61 /* 62 * 獲取時(shí)間并存放進(jìn)buff數(shù)組 63 */ 64 ticks = time(NULL); 65 ptm = localtime(&ticks); 66 snprintf(buff, sizeof(buff), "現(xiàn)在是北京時(shí)間:\n%d年 %d月 %d日 %d時(shí) %d分", ptm->tm_year+1900, ptm->tm_mon+1, ptm->tm_mday, ptm->tm_hour, ptm->tm_min); 67 68 // 往客戶端緩沖區(qū)中寫入時(shí)間 69 while (write(connfd, buff, strlen(buff)) < 0) { 70 puts("寫入數(shù)據(jù)失敗\n"); 71 return 4; 72 } 73 // 關(guān)閉連接 74 if (close(connfd)) { 75 puts("關(guān)閉套接字失敗\n"); 76 return 5; 77 } 78 } 79 }

運(yùn)行測(cè)試

  1. 在一個(gè)終端用超級(jí)用戶權(quán)限啟動(dòng)服務(wù)器:

?  

  2. 在另一個(gè)終端中啟動(dòng)客戶端并輸進(jìn)本機(jī)IP或者127.0.0.1:

  

?

轉(zhuǎn)載于:https://www.cnblogs.com/scut-fm/p/3321508.html

總結(jié)

以上是生活随笔為你收集整理的一对经典的时间获取客户/服务器程序的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。