網路程式設計課上學習了一些socket函式,在c語言下和mfc下小結一下:
首先socket的五元組有《源ip,目標ip,源埠,目的埠,協議》
總的來說socket分為幾個步驟,對於客戶端:
1. 初始化
2. 建立socket結構,填充如tcp/udp型別,ipv4結構等
3. 建立目標ip的位址,目的埠資訊結構,然後進行連線connect();
(客戶端自己如果對埠沒有要求可以不用bind乙個固定埠,但也可以通過connect函式返回後得到自己實際使用的是哪乙個埠)
4. 連線建立
也就是對於客戶端,簡單的只要初始化《目標ip,目的埠,協議》就行了
//初始化
wsadata
wsadata;
wsastartup(0x0202,&wsadata);
//建立socket結構 可能失敗
mcon=socket(af_inet,sock_stream,0);
/*e.g sockaddr_in serveraddr;
charbuffer[20]=」127.0.0.1」;
建立目標的資訊 */
serveraddr.sin_family =pf_inet;
serveraddr.sin_port =htons(1088); //目的埠
serveraddr.sin_addr.s_un.s_addr =inet_addr(buffer); //目的位址
//進行連線 需要判斷是否成功
if(connect(mcon,(sockaddr*)&serveraddr,sizeof(serveraddr))!=socket_error)
進行相應的send/recv工作….
格式問題:1.sockaddr_in結構是windows中對於sockaddr型別的重寫,兩者的大小是相同的這樣可以更好的對ip位址的每一位進行操作
struct sockaddr;
struct sockaddr_in;
2.htons()
用於將乙個我們常見的埠如80,轉化為乙個short型別埠,實際網路中傳遞的都是這個short值 也可記為host-to-net
ntohs()
功能剛好相反,用於將short型別的埠轉化為主機埠net-to-host
3.inet_addr()用於將乙個char型別的字串(以0結尾),轉化為乙個無符號長整型
對於服務端,進行的工作與之差不多,只是服務端需要指明自己開放的是哪乙個埠和ip,需要用bind函式
1.初始化
2.建立socket結構,填充如tcp/udp型別,ipv4結構等
3.建立自己ip的位址,埠資訊,繫結本機
4.監聽是否有連線
5.接受連線請求
//初始化
wsadata
wsadata;
wsastartup(0x0202,&wsadata);
//建立socket結構
s=socket(af_inet,sock_stream,0);
//sockaddr_in
con;
con.sin_addr.s_un.s_addr =inet_addr("127.0.0.1");
con.sin_port =htons(1088);
con.sin_family = pf_inet; //
繫結本機
可能會失敗,如埠被占用等錯誤
bind(s,(const
sockaddr*)&con,sizeof(sockaddr_in))!=no_error
//監聽是否有請求,第二個引數用來表示最大允許多少個使用者登陸
listen(s,5); //
接受這個請求,對應的那個客戶端的
connect
函式返回成功
acflag=accept(s,(sockaddr*)&tcpcon,&i);
進行相應的send/recv工作….
在做客戶端的時候因為往往要涉及到介面的編寫,所以相互之間的資料轉換比較麻煩,以mfc為例傳送http,其也提供了乙個類似的函式。
//建立網路發出請求
解析乙個如下形式的url:service://server/dir/dir/object.ext:port,返回的內容如下:
預設是80埠 */
afxparseurl(url,dwservicetype, strserver,strobject, nport);
//建立連線 對應於socket中的connect函式
//構造相應的http報文,實際上類似於send函式,只不過對具體內容進行了封裝
//開啟這個連線,構造http報頭
//傳送get請求
//等待請求是否有回應statuscode為返回碼,表示http連線是否成功
以上內容均為乙個大概的框架,具體函式功能及引數請參閱相關文件o(∩_∩)o~。
socket程式設計小記
1.在寫乙個原始套接字程式設計的過程中查到的知識點 建立原始套接字之後,就可以使用sendto 和recvfrom 傳送和接收icmp資料報了。原始套接字接收報文規則 若接收的報文協議型別和定義的原始套接字匹配,那麼接收的所有資料拷貝入套接字中 如果套接字繫結了本地位址,那麼只有接收資料ip頭中對應...
socket程式設計小記
前言 winsock是由unix下的bsd socket發展而來,是乙個與網路協議無關的程式設計介面。標頭檔案 include 引用庫 pragma comment lib,ws2 32.lib 引數 wversionrequested 版本資訊。高階位元組指定小版本號,低位位元組指定主版本號。lp...
Socket程式設計問題小記
在socket程式設計中,如果在乙個while迴圈中使用 objectinputstream reader new objectinputstream socket.getinputstream reader.readobject 可能會出現eofexception,看了網上的很多答案和解釋,覺得都...