Winsock程式設計入門 2 定址協議 IPv4

2021-09-07 20:59:48 字數 2110 閱讀 9309

winsock是與協議無關的介面,這裡我們主要介紹廣泛使用的ip協議,其版本為當前的ipv4(ipv6暫不介紹).

ipv4定址

ipv4中,計算機的位址用32位的二進位制表示,稱為ip位址.當客戶機使用tcp或udp與伺服器通訊時,必須指定其ip位址及通訊埠.伺服器想要偵聽客戶機請求時,也要指定ip位址與埠.winsock中使用

sockaddr_in結構來設定這些資訊:

struct sockaddr_in

;

sin_family必須為

af_inet,設定winsock使用ip位址族.

sin_port定義tcp或udp的通訊埠. 埠要認真選擇,一些知名服務使占用了特定的埠,如ftp及http

sin_addr記錄了ipv4的4位元組位址,它是無符號長整型,ip位址通常以"a.b.c.d"表示,每個字母表示乙個數字與ip位址的每個位元組對應(從左到右)

sin_zero只是用來占用位元組空間使得

sockaddr_in結構與

sockaddr結構一樣.

函式 inet_addr可以將字串"a.b.c.d"格式的ip位址轉換為32位無符號長整型的ip位址.

unsigned long inet_addr(const char far *cp); 

cp就是指向null結尾的字串形式ip位址.返回以網路字元順序表示的ip位址.

位元組順序

不同計算機的處理器以big-endian或little-endian形式來表示數字.而ip位址與埠需要多個位元組來表示,它們在不同計算機上的表示順序稱為主機位元組順序.而ip位址與埠在網路中的表示不應該有差異,必須以big-endian形式表示,稱為網路位元組順序.

下面的winsock api可以將主機位元組順序轉換為網路位元組順序:

u_long htonl(u_long hostlong);

int wsahtonl(socket s, u_long hostlong, u_long far * lpnetlong);

u_short htons(u_short hostshort);

int wsahtons( socket s, u_short hostshort, u_short far * lpnetshort);

而下而的api則將網路位元組順序轉換為主機位元組順序:

u_long ntohl(u_long netlong);

int wsantohl(socket s,u_long netlong, u_long far * lphostlong);

u_short ntohs(u_short netshort);

int wsantohs(socket s, u_short netshort, u_short far * lphostshort);

下面**說明了如何用sockaddr_in結構來設定位址與埠:

sockaddr_in internetaddr;

int nportid = 5150;

internetaddr.sin_family = af_inet;

//將字串表示的ip位址轉換為4個位元組表示的整數,並賦值給sin_addr

internetaddr.sin_addr.s_addr = inet_addr("136.149.3.29");

//nportid變數以主機位元組的順序儲存.將nportid轉換為網路位元組順序,並賦值給sin_port

internetaddr.sin_port = htons(nportid);

ip位址不是那麼容易記憶,可以使用更友好的主機名來代替ip位址,比如www.somewebsite.com,用ftp來表示檔案傳輸協議埠號21.與之相關的函式有:getaddrinfo, getnameinfo, gethostbyaddr, gethostbyname, gethostname, getprotobyname, getprotobynumber, get-servbyname, 及getservbyport. 這些函式的非同步版本有: wsaasyncgethostbyaddr, wsaasyncgethostbyname, wsaasyncgetprotobyname, wsaasyncgetprotobynumber, wsaasyncgetservby- name,及wsaasyncgetservbyport.

Winsock程式設計入門 2

二 簡單的tcp客戶端 介紹 本文是 winsock程式設計入門 1 簡單的tcp伺服器 一文的結局,如果你還沒有讀過第1部分的話,我還是建議你首先讀一下。在本文中,我將示範給你如何編寫乙個簡單的tcp客戶端程式。我們要編寫乙個程式,這個程式將連線到乙個http伺服器,並獲得乙個檔案。乙個簡單的tc...

Winsock程式設計入門 2

二 簡單的tcp客戶端 介紹 本文是 winsock程式設計入門 1 簡單的tcp伺服器 一文的結局,如果你還沒有讀過第1部分的話,我還是建議你首先讀一下。在本文中,我將示範給你如何編寫乙個簡單的tcp客戶端程式。我們要編寫乙個程式,這個程式將連線到乙個http伺服器,並獲得乙個檔案。乙個簡單的tc...

Winsock程式設計入門 1

一 簡單的tcp伺服器 介紹 winsock api是一套供microsoft windows作業系統使用的套接字程式庫,它最初基於berkeley套接字,但是其中加入了一些microsoft的特殊改動。在這篇文章中,我要試著給你介紹如何使用winsock來進行套接字程式設計,並假設你沒有在任何作業...