套接字函數介紹
  套接字函數通常封裝在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數量確定