//寫在前面,這一部分是和之前的echocint程式學習對應。
//希望通過這兩個程式學習初步建立起基於winsock的計算機網路框架模型
伺服器程式echoserv,完成等待客戶的連線,接收客戶端傳送來的任何資料,並將它們簡單地發回客戶端。伺服器程式設定最多乙個引數,即伺服器偵聽的埠號。
這一部分與之前的echocint客戶端程式相同。完成標頭檔案包含、庫檔案鏈結與常量的巨集定義。#include
#include
#pragma comment(lib,"ws2_32")
#define echo_def_port 7
#define echo_buf_size 256
if (argc == 2)
這裡進行命令列引數檢查,伺服器程式可以有乙個引數,用來指定伺服器的埠號。如果引數缺失,則使用預設埠號。
這裡額外要說,這兩個程式涉及到許多關於命令列的知識,我有許多欠缺,在完成這部分學習內容,應該去補充一下。
頭兩句與echocint類似,這裡要注意的是sin_addr.s_addr,即伺服器位址值為inaddr_any,也就是說如果主機有多個網路介面,允許伺服器在任意網路介面上接受客戶的鏈結。wsastartup(makeword(2, 0), &wsa_data);
echo_soc = socket(af_inet, sock_stream, 0);
serv_addr.sin_family = af_inet;
serv_addr.sin_port = htons(port);
serv_addr.sin_addr.s_addr = inaddr_any;
result = bind(echo_soc,
(struct sockaddr *)&serv_addr,sizeof(serv_addr));
if (result == socket_error)
這裡result是返回函式bind()的值,函式bind把伺服器的位址和埠繫結到了socket套介面上。bind()函式接受三個引數:
1.socket s:待**socket;
2.struct sockaddr far *name:賦予socket的主機位址標識;
3.int len:name的長度,一般也是struct sockaddr_in型別的伺服器位址長度。
bind()函式呼叫成功,返回0.返回值-1說明呼叫失敗;error的值有**可查詢bind()函式介紹。
listen(echo_soc, somaxconn);
listen()函式要求socket接受到達的連線,第二個引數規定了可以接受的未完成的最大連線數量,somaxconn要求底層來確定合理的最大連線數量。偵聽listen()只適用於面向連線的socket,比如sock_stream,該函式將socket轉變到被動模式。
while(1)是乙個無限迴圈,處理客戶的連線請求,並完成與客戶的通訊。伺服器呼叫accpet()函式後處於休眠狀態,等待客戶的連線請求。連線的過程要經過三次握手過程。注意!這裡涉及到了三次握手的概念,好像是計算機網路中非常重要的概念。只有當我握手完成時,函式accept()才會返回。返回值是乙個新的套介面描述符。accept()函式的第printf("[echo server] is running ... ... \n");
while (1)
result = recv(acpt_soc,recv_buf, echo_buf_size, 0);
if (result > 0)
closesocket(acpt_soc);
}
二、第三引數是對方的位址資訊,位址的格式由建立連線時的位址族確定。
後面先呼叫recv接收客戶程式傳送來的資料,資料要求長度小於echo_buf_size位元組。沒有錯誤,就可以將結果列印出來。然後將從客戶程式收到的資料原樣發回給客戶端。最後關閉與客戶端的連線。
這裡要注意和客戶程式不一樣,這裡是要程式出錯才會走到這裡的。關閉伺服器的socket,釋放winsock的資源。closesocket(echo_soc);
wsacleanup();
結合前一篇部落格——echocint程式學習的問題,我終於搞明白了書中是如何執行這兩個程式了。
首先開啟echoserv,f5或者ctrl+f5都可以,就能得到上乙個執行結果圖,然後開啟cmd命令列視窗,切換到echocint.exe檔案所在目錄中。然後輸入echocint.exe 127.0.0.1。這就是輸入的兩個引數,乙個是程式名,乙個是伺服器位址,還可以輸入伺服器端口號,但是這裡沒有,則採用預設的伺服器端口號。然後就可以如下結果。
0;}通過這兩個程式的實踐初步明白了如果利用winsock進行echo的網路通訊測試。但是很多細節部分沒有展開細說。此外,涉及到c++程式設計知識,尤其是命令列的輸入與int main(int argc, char **argv){}的兩個引數的關係值得我進一步**。這些內容將放到後面的部落格中進一步討論。
B 學密碼學真的得學程式
b 學密碼學真的得學程式 time limit 1000msmemory limit 65536kb64bit io format lld llu submit status practice sdutoj 2464 description 話說,上次zyj同學最終在眾位瑪麗亞的幫助下搞定了那個神奇...
程式設計師學python 程式設計師學Python
章python基礎1 1.1表示式和計算1 1.1.1數值計算1 1.1.2標準函式和數學函式包5 1.1.3字串7 1.2變數和賦值10 1.2.1名字 變數和賦值10 1.2.2簡單指令碼程式12 章python基礎1 1.1表示式和計算1 1.1.1數值計算1 1.1.2標準函式和數學函式包5...
學程式為什麼要學英語?
首先,你不會英語也能上手程式設計,但是你為什麼要去學英語呢?人是利益驅動的,看看學英語帶來的好處,就能理解為什麼要去學英語了。獲取高質量的學習資源 絕大多數高質量的計算機學習資源都是英文。國內的多數資源都是 二手 的。無損 及時的資訊獲取 大多數計算機經典圖書原版都是英文,我們所看的中文版都是二手加...