socket程式設計小記

2021-06-14 02:09:31 字數 3353 閱讀 6008

網路程式設計課上學習了一些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,看了網上的很多答案和解釋,覺得都...