套接字函數介紹
套接字函數通常封裝在Ws2_32.dll動態連接庫中,頭文件是winsock2.h,因此用戶需要引用頭文件和鏈接庫
#include “winsock.h” //引用頭文件
#pragma comment(lib,”ws2_32.lib”) //鏈接庫文件
此外,使用套接庫函數前需要初始化套接字,使用函數WSAStartup()實現
例如: WSADATA wsd; //定義WSADATA對象
WSAStartup(MAKEWORD(2,2),&wsd); //初始化套接字
下面介紹一些套接字函數
1:WSAStartup函數:用於初始化動態連接庫,而且不可或缺
int WSAStartup(WORD wVersionRequested,LPWSADATA lpWDADATA)
//用法參見前面幾行代碼
2:socket函數:用於創建一個套接字
SOCKET socket(int af, int type, int protocol)
Af:表示一個地址家族,通常是AF_INET
type:表示套接字類型。SOCK_STREAM:創建面向連接的流式套接字
SOCK_DGRAM:表示創建面向無連接的數據報套接字,SOCK_RAW:表示創原始套接
protocol:表示所用的協議,不指定時可以設置爲0
函數的返回值是創建的套接字句柄
3:bind函數:用於將套接字綁定到指定的端口和地址上
int bind(SOCKET s,const struct sockadddr FAR * name, int namelen)
s:表示套接字標誌
name:是一個sockaddr結構指針,包含了端口和地址
namelen:確定name緩衝區長度
返回值:成功返回0;失敗返回SOCKET_ERROR
4: listen函數:用於將套接字設置爲監聽模式。對於流式套接字必須是該模式
Int listen(SOCKET s, int backlog)
Backlog: 表示等待連接的最大隊列長度
5:accept函數:用於接收客戶端的鏈接
SOCKET accept(SOCKET s, struct sockaddr FAR *addr, int FAR * addlen)
S:一個套接字標誌,應該處於監聽狀態
addr:包含一組客戶端的端口和地址信息
addlen:用於接收參數addr的長度
返回值:一個新的套接字,它對應於已經接受的客戶端連接,對於該客戶端的所有後
續操作,都應該使用這個新的套接字
6:closesocket函數:關閉套接字
int closesocket(SOCKET s);
7:connect函數:用於發送一個連續請求
int connect(SOCKET s, const struct sockaddr FAR * name, int namelen)
name:表示套接字想鏈接的主機地址和端口號
namelen:表示緩衝區長度
成功返回0,走則爲SOCKET_ERROR
8:htons函數:將一個16位的無符號短整型數據由主機排列方式轉換成網絡排列方式
u_short htons(u_short hostshort)
hostshort:表示一個主機排列方式的無符號整形數據
返回值是一個網絡排序的無符號短整型數據
9:htonl函數:表示將一個主機排列的長整型數據有主機排列轉換成網絡排列
u_long htonl(u_long hostlong);
10:inet_addr函數:將一個由字符串表示的地址轉換成32位的無符號長整型數據
Unsigned long inet_addr(const char FAR * cp);
cp:表示一個IP地址的字符串
返回一個32位無符號長整數
11:recv函數:用於從面向連接的套接字中接收數據
int recv(SOCKET s, char FAR *buf,int len, int flags)
buf:接收數據的緩衝區
len:buf的長度
flags表示函數的調用方式 MSG_PEEK:表示查看傳來的數據
MSG_OOB表示用來處理外帶數據
12;send函數:用於在面向連接方式的套接字間發送數據
int send(SOCKET s, const char FAR * buf, int len, int flags)
buf要發送數據緩衝區的大小
flags函數的調用方式
13:select函數:用來檢查一個或多個套接字是否處於可讀、可寫或錯誤狀態
Int select(int nfds,fd_set FAR *readfds, fd_set FAR *writefds,fd_set FAR * exceptfds, const struct timeval FAR * timeout)
nfds:無實際意義
readfds表示一組可讀套接字
writefds表示一組可寫套接字
exceptfds表示一組被檢查有錯誤的套接字
timeout表示函數的等待時間
14:WSACleanup函數:用於釋放從Ws2_32.dll動態連接庫初始化分配的資源
Int WSACleanup(void)
15:WSAAsyncSelect函數,用於將網絡中發生的事情關聯到窗口的某個消息中
Int WSAAsyncSelect(SOCKET s,HWND hwnd,unsigned int wMsg,long lEvent)
Hwnd:表示接收消息的窗口句柄
wMsg表示窗口接受來自套接字中的消息
lEvent表示網絡中發生的事
16:ioctlsocket函數:用於設置套接字的I/O模式
Int ioctlsocket(SOCKET s, long cmd, u_long FAR * argp)
Cmd:操作命令:如果是FIONBIO,argp爲0時,表示禁止非阻塞模式,argp爲非0時表示設置是非阻塞模式。如果是FIONREAD表示從套接字中可以讀取的數據量。SIOCATMARK 表示是否所有的外帶數據都已被寫入。
argp表示命令參數
17WSAGetOverlappedResult函數,用於獲取重疊I/O操作完成時的結果
BOOL WSAGetOverlappedResult(SOCKET s, LPWSAOVERLAPPED lpOverlapped, LPDWORD lpcbTransfer,BOOL fWait,LPDWORD lpdwFlags)
S:表示套接字
lpOverlapped:標誌一個I/O重疊操作的結構指針
lpcbTransfer:表示本次操作實際接受或發送的字節數
fWait: TRUE表示除非I/O操作完成,否則函數不會返回,FALSE表示如果函數進行中,則函數立即返回FALSE
lpdwFlags:表示一組標記,通常來自於WSARecv函數的lpFlags參數
18CreateIoCompletionPort函數,表示用於創建完成端口對象
HANDLE CreareIoCompletionPort(HANDLE FileHandle, HANDLE ExitingCompetionPort,ULONG_PTR CompletionKey,DWORD NumberOfConcurrentThread);
FileHandle:表示完成端口的關聯對象。如果是創建完成端口,參數爲INVALID_HANDLE_VALUE;
ExitingCompetionPort:表示關聯FileHandle對象的完成端口,如果創建完成端口,參數是NULL
CompletionKey:表示端口的完成鍵值,用戶指定一個自定義的結構指針,用於表示關聯完成端口的附加數據
NumberOfConcurrentThread:表示允許同時運行的用戶線程的最大數量,通常設置爲0,表示系統根據CPU數量確定