標籤:nbsp call erro ipv6 控制代碼 結構 socket sar 提供者
Windows Sockets為了支援Windows訊息驅動機制,使應用程式開發人員能夠方便地處理網路通訊,對網路事件採用了基於訊息的非同步存取策略;
1、WSAAsyncSelect
該函數為指定的通訊端(socket)請求基於Windows訊息的網路事件通知,並自動將該通訊端設定為非阻塞模式;
int WSAAsyncSelect (
SOCKET s,
HWND hWnd,
unsigned int wMsg,
long lEvent
);
s:標識請求網路事件通知的通訊端;
hWnd:標識一個網路事件發生時接收訊息的視窗的控制代碼;
wMsg:指定網路事件發生時視窗將接收到的訊息;
lEvent:指定應用程式感興趣的網路事件,包括:
FD_READ --有關是否可讀的通知,以便讀取資料
FD_WRITE --有關是否可寫的通知,以便發送資料
FD_OOB --是否帶外(OOB)資料抵達的通知
FD_ACCEPT --與進入串連有關的通知
FD_CONNECT --串連操作已完成的通知
FD_CLOSE --與通訊端關閉有關的通知
FD_QOS --通訊端“服務品質”發生更改的通知
FD_GROUP_QOS --通訊端組“服務品質”發生更改的通知
FD_ROUTING_INTERFACE_CHANGE --在指定的方向上,與路由介面發生變化有關的通知
FD_ADDRESS_LIST_CHANGE --針對通訊端的協議家族,本地地址清單發生變化的通知
2、WSAEnumProtocols
該函數可獲得系統中安裝的網路通訊協定的相關資訊,該函數不能重複調用,傳入的緩衝區必須足夠大以便能存放所有元素;
int WSAEnumProtocols (
LPINT lpiProtocols,
LPWSAPROTOCOL_INFO lpProtocolBuffer,
ILPDWORD lpdwBufferLength
);
lpiProtocols:一個以NULL結尾的協議標識號數組;如果為NULL,則該函數返回所有可用協議的資訊,否則只返回數組中列出的協議資訊;
lpProtocolBuffer:作為傳回值使用,一個用WSAPROTOCOL_INFO結構體填充的緩衝區;WSAPROTOCOL_INFO結構體用來存放或得到一個指定協議的完整資訊;
lpdwBufferLength:在輸入時,指定傳遞給該函數的參數lpProtocolBuffer緩衝區的長度;在輸出時,存有擷取所有請求資訊需傳遞給該函數的最小緩衝區的長度;
3、WSAStartup
該函數將初始化進程使用的socket庫;
int WSAStartup (
WORD wVersionRequested,
LPWSADATA lpWSAData
);
wVersionRequested:可以使用的socket庫的版本;高位位元組指定庫的副版本,低位位元組為主要版本;
lpWSAData:返回可用庫的資訊,是一個指向WSADATA資料結構類型變數的指標;
4、WSACleanup
該函數將終止程式對socket庫的使用;
int WSACleanup();
5、WSASocket
該函數將建立通訊端;
SOCKET WSASocket (
int af,
int type,
int protocol,
LPWSAPROTOCOL_INFO lpProtocolInfo,
GROUP g,
DWORD dwFlags
);
af:指定地址族,AF_UNIX/AF_LOCAL/AF_FILE--本地通訊;AF_INET--網路通訊IPv4(主用);AF_INET6--網路通訊IPv6(首碼AF替換成PF效果一樣);
type:指定socket類型,SOCK_STREAM--流式通訊端,SOCK_DGRAM--資料報式通訊端;
protocol:推薦為0;
lpProtocolInfo:一個指向WSAPROTOCOL_INFO結構體的指標,該結構體定義了所建立的通訊端的特性;可以為NULL;
g:保留參數;
dwFlags:指定通訊端屬性的描述;如果設為WSA_FLAG_OVERLAPPED,將建立一個重疊通訊端;
6、WSARecv---recv函數的擴充版本
int WSARecv (
SOCKET s,
LPWSABUF lpBuffers,
DWORD dwBufferCount,
LPDWORD lpNumberOfBytesRecvd,
LPDWORD lpFlags,
LPWSAOVERLAPPED lpOverlapped,
LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionROUTINE
);
7、WSASend---send函數的擴充版本
int WSASend (
SOCKET s,
LPWSABUF lpBuffers,
DWORD dwBufferCount,
LPDWORD lpNumberOfBytesSent,
DWORD dwFlags,
LPWSAOVERLAPPED lpOverlapped,
LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionROUTINE
);
8、WSARecvFrom---recvfrom函數的擴充版本
該函數接收資料報類型的資料,並儲存資料發送方的地址;通過該函數的第2個參數可知,在調用該函數接收資料時,可同時定義多個WSABUF結構體變數來接收資料,並通過該函數的第3個參數指定WSABUF結構體的數量;
int WSARecvFrom (
SOCKET s,
LPWSABUF lpBuffers,
DWORD dwBufferCount,
LPDWORD lpNumberOfBytesRecvd,
LPDWORD lpFlags,
struct sockaddr FAR * lpFrom,
LPINT lpFromlen,
LPWSAOVERLAPPED lpOverlapped,
LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionROUTINE
);
s:標識通訊端;
lpBuffers:指向WSABUF結構體數組的指標,該結構體的定義為:
typedef struct __WSABUF{
u_long len; //緩衝區的長度
char FAR *buf; //指向緩衝區的指標
}WSABUF, FAR * LPWSABUF;
dwBufferCount:lpBuffers數組中WSABUF結構體的數目;
lpNumberOfBytesRecvd:指向本次調用所接收的位元組數的指標;
lpFlags:取值包括:
MSG_PEEK --瀏覽到來的資料,這些資料被複製到緩衝區,但並不從輸入隊列中移除;僅對非重疊通訊端有效;
MSG_OOB --處理帶外(OOB)資料
MSG_PARTIAL --僅用於面向訊息的通訊端;作為輸出參數時,表明資料是發送方傳送的訊息的一部分,訊息的剩餘部分將在隨後的接收操作中被傳送,如果隨後的某個接收操作沒有此標誌,就表明這是發送方發送的訊息的尾部;作為輸入參數時,表明接收操作已完成,即使只是一條訊息的部分資料已被服務提供者所接收;
lpFrom:一個可選的指標,指向重疊操作完成後存放源地址的緩衝區;
lpFromlen:一個指向lpFrom指定的緩衝區大小的指標,僅當指定了lpFrom參數時才須使用該參數;
lpOverlapped:一個指向WSAOVERLAPPED結構體的指標,非重疊通訊端則忽略此參數;
lpCompletionROUTINE:一個指向接收操作完成時調用的完成常式的指標,該常式實際上就是如下所示的一個回呼函數,非重疊通訊端則忽略此參數;
void CALLBACK CompletionROUTINE(
IN DWORD dwError,
IN DWORD cbTransferred,
IN LPWSAOVERLAPPED lpOverlapped,
IN DWORD dwFlags
);
9、WSASendTo---sendto函數的擴充版本
int WSASendTo (
SOCKET s,
LPWSABUF lpBuffers,
DWORD dwBufferCount,
LPDWORD lpNumberOfBytesSent,
DWORD dwFlags,
const struct sockaddr FAR * lpTo,
int iToLen,
LPWSAOVERLAPPED lpOverlapped,
LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionROUTINE
);
s:標識一個通訊端
lpBuffers:一個指向WSABUF結構體的指標;
dwBufferCount:lpBuffers數組中WSABUF結構體的數目;
lpNumberOfBytesSent:一個指向本次調用所發送的位元組數的指標;
dwFlags:指示影響操作行為的標誌位,設為0;
lpTo:可選指標,指向目標通訊端的地址;
iToLen:lpTo中地址的長度;
lpOverlapped:一個指向WSAOVERLAPPED結構體的指標,非重疊通訊端忽略該參數;
lpCompletionROUTINE:一個指向接收操作完成時調用的完成常式的指標,非重疊通訊端忽略該參數;
以WSA開頭的API,結合了Windows平台特性