套接字函數詳細介紹

 

套接字函數介紹

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章