天天看點

socket程式設計小記

網絡程式設計課上學習了一些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);

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{

u_short sa_family;

char sa_data[14];

};

struct sockaddr_in{

Short sin_family;

u_short sin_port;

struct in_addr sin_addr;

char sin_zero[8];

};

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,其也提供了一個類似的函數。

//建立網絡送出請求

CInternetSession MyConnect("MFC ",1,INTERNET_OPEN_TYPE_DIRECT);

CHttpConnection* pServer= NULL;

CHttpFile* pHttpFile=NULL;

INTERNET_PORT nPort;

AfxParseURL(URL,dwServiceType, strServer,strObject, nPort);

//建立連接配接 對應于socket中的Connect函數

pServer=MyConnect.GetHttpConnection(strServer, nPort);

//構造相應的http封包,實際上類似于send函數,隻不過對具體内容進行了封裝

//打開這個連接配接,構造http報頭

pHttpFile = pServer->OpenRequest(CHttpConnection::HTTP_VERB_GET,

           strObject, NULL,1, NULL, NULL);

pHttpFile->AddRequestHeaders(_T("Accept: */*\r\nUser-Agent:MFC\r\n"));

    //發送GET請求

pHttpFile->SendRequest();

//等待請求是否有回應StatusCode為傳回碼,表示http連接配接是否成功

    DWORD StatusCode;

pHttpFile->QueryInfoStatusCode(StatusCode);

以上内容均為一個大概的架構,具體函數功能及參數請參閱相關文檔O(∩_∩)O~。

繼續閱讀