文章目錄
- 一、Winsock初始化
- 二、IPv4結構體
- 三、建立通訊端
- 四、伺服器需要調用的的函數及步驟
- 五、用戶端需要調用的函數及步驟
一、Winsock初始化
每個Winsock程式都必須載入合適的Winsock DLL版本,現有winsock1,winsock2。在調用Winsock之前首先的工作就是載入winsock相應的庫。
載入所用的API是WSAStartup
當應用程式結束之後,關閉的API是WSACleanup
WSAStartup需要一個版本號碼資訊及一個WSADATA的結構體作為函數的傳回值。它的原型是這樣的:
int WSAStartup(WORD wVersionRequested,
LPWSADATA lpWSAData);
下面, 看一下WSAData結構體究竟描述了些什麼資訊:
typedef struct WSAData
{
WORD wVersion; //版本號碼
WORD wHighVersion; //現有Winsock的最高版本
char szDescription[..]; //沒有實際作用
char szSystemStatus[..]; //沒有實際作用
unsigned short iMaxSocket; //可同時開啟的最大通訊端數量
unsigned short iMaxUdpDg; //資料報最大長度
char FAR* lpVendorInfo; //保留欄位
}WSADATA* LPWSADATA
具體的代碼:
#include "winsock2.h"
int main()
{
WSADATA wsaData;
int Ret = WSAStartup(MAKEWORD(2,2),&wsaData);
if(Ret != 0)
{
cout<<"無法初始化winsock."<<endl;
}
else
cout<<"初始化winsock成功"<<endl;
//..
if(WSACleanup()==SOCKET_ERROR)
{
cout<<"WSAData無法cleanup.";
}
return 0;
}
二、IPv4結構體
當電腦通過TCP、UDP進行通迅時,用得最多的可能就是其主機的IP地址,應用程式的連接埠號碼。如何來表示這些資訊呢?在Winsock中,可以通過一個結構體來指定其IP和服務連接埠的資訊。結構體如下:
struct sockaddr_in
{
short sin_family; //必須指定AF_INET
u_short sin_port; //連接埠號碼
struct in_addr sin_addr; //IP的地址表示
char sin_zero[8]; //填充欄位,用來相容SOCKADDR結構體
};
還有一些其它的函數,可以很方便的進行IP地址至字串形式,32位整行形式 in_addr結構體形式的轉換。還有的,可以把本地位元組順序與網路位元組順序進行轉換
1.把一個點分IP轉換成一個32位無符號長整型:
unsigned long inet_addr(const char FAR* cp);
2.將主機位元組順序轉換為網路位元組順序
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);
以上有不同的只是有些位元組需要轉換為long型,比如IP地址,有些只需要short型就可以了,比如PORT號.
而與上面逆向的函數則有:
u_long ntohl(u_long netlong);
int WSANtohl(SOCKET s, u_long netlong, u_long FAR* lphostlong);
//關於short型的,這裡略
三、建立通訊端四、伺服器需要調用的的函數及步驟五、用戶端需要調用的函數及步驟六、資料轉送與接收