第20節(1 / 2)

32.DLL

int WSAStartup(

WORD wVersionRequested,//高位字節指定Winsock庫的副版本,低位字節是主版本號

LPWSADATA lpWSAData//[out]用來接收Windows Sockets實現細節

);

<4> 終止對套字庫WS2_32.DLL的使用

int WSACleanup (void);

<5> Winsock庫中的擴展函數WSASocket將創建套接字

SOCKET WSASocket(

int af,//地址簇標識

int type,//socket類型SOCK_DGRAM為UDP

int protocol,//協議簇

LPWSAPROTOCOL_INFO lpProtocolInfo,//定義創建套接字的特性,如果為NULL,則

//WinSock2.Dll使用前三個參數決定使用哪個服務提供者

GROUP g,//保留

DWORD dwFlags//指定套接字屬性的描述,如果為WSA_FAG_OVERLAPPED則為一個重疊套接字,與文件中相似,

);

然後在套接字上調用WSASend, WSARecv,WSASendTo,WSARecvFrom,SWAIoctl這些函數都會立即返回,這些操作完成後,操作係統會通過某種方式來通知調用線程,後者就可以根據通知信息判斷操作是否完成

<6> WSARecvFrom接收數據報類型的數據,並保存數據發送方的地址

int WSARecvFrom(

SOCKET s,//套接字描述符

LPWSABUF lpBuffers,//指向WSABUF數據指針,一個成員緩衝區指針buf,另個長度

DWORD dwBufferCount,//lpBuffers數組中WSABUF結構體的數上,一般為1

LPDWORD lpNumberOfBytesRecvd,//[out]接收完成後數據字節數指針

LPDWORD lpFlags,//[in/out]標誌會影響函數行為,設置為0即可

struct sockaddr FAR *lpFrom,//[out]可選,指向重疊操作完成後存放源地址的緩衝區

LPINT lpFromlen,//[in/out]指定lpFrom緩衝區大小的指針

LPWSAOVERLAPPED lpOverlapped,//指向重疊套接字指針,非重疊忽略

LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine//一個指定接收完成時調用的完成全程指針(非重疊套接字的忽略0

);

如果創建是重疊套接字,最後兩個參數值要設置,因為這時將會采用重疊I/O,函數會返回,當接收數據這一操作完成後,操作係統會調用lpCompletionRoutine參數指定的例程來通知調用線程,這個例程就是一個回調函數.

<7>WSASendTo發送數據報類型的數據

int WSASendTo(

SOCKET s,//套接字描述符

LPWSABUF lpBuffers,

DWORD dwBufferCount,

LPDWORD lpNumberOfBytesSent,

DWORD dwFlags,//0即可

const struct sockaddr FAR *lpTo,//可選指針,指向目標套接字的地址

int iToLen,//lpTo中地址長度

LPWSAOVERLAPPED lpOverlapped,

LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine

);

5. 一個網絡聊天室程序的實現

新建工程基於對話框,工程名為Chat,並添加一些控件主要兩個編輯,IP控件和發送按鈕

[1] 加載套接字庫