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