ioctlsocket() 用法

ForTechnology發表於2011-08-09
Normal 0 7.8 磅 0 2 false false false MicrosoftInternetExplorer4 ioctlsocket() 用法

2011-01-05 10:52

ioctlsocket()  簡述:
  控制套介面的模式。
  #include
  int PASCAL FAR ioctlsocket( SOCKET s, long cmd, u_long FAR* argp);
  s:一個標識套介面的描述字。
  cmd:對套介面s的操作命令。
  argp:指向cmd命令所帶引數的指標。
  註釋:
  本函式可用於任一狀態的任一套介面。它用於獲取與套介面相關的操作引數,而與具體協議或通訊子系統無關。支援下列命令:

    FIONBIO:允許或禁止套介面s的非阻塞模式。argp指向一個無符號長整型。如允許非阻塞模式則非零,如禁止非阻塞模式則為零。
   
當建立一個套介面時,它就處於阻塞模式(也就是說非阻塞模式被禁止)。這與BSD套介面是一致的。WSAAsynSelect()函式將套介面自動設定為非阻塞模式。
   
如果已對一個套介面進行了WSAAsynSelect() 操作,則任何用ioctlsocket()來把套介面重新設定成阻塞模式的試圖將以WSAEINVAL失敗。
   
為了把套介面重新設定成阻塞模式,應用程式必須首先用WSAAsynSelect()呼叫(IEvent引數置為0)來禁至WSAAsynSelect()

    FIONREAD:確定套介面s自動讀入的資料量。argp指向一個無符號長整型,其中存有ioctlsocket()的返回值。如果sSOCKET_STREAM型別,
   
FIONREAD返回在一次recv()中所接收的所有資料量。這通常與套介面中排隊的資料總量相同。如果SSOCK_DGRAM 型,
   
FIONREAD返回套介面上排隊的第一個資料包大小。

    SIOCATMARK:確實是否所有的帶外資料都已被讀入。這個命令僅適用於SOCK_STREAM型別的套介面,且該套介面已被設定為可以線上接收帶外資料(SO_OOBINLINE)。
   
如無帶外資料等待讀入,則該操作返回TRUE真。否則的話返回FALSE假,下一個recv()recvfrom()操作將檢索標記前一些或所有資料。
   
應用程式可用SIOCATMARK操作來確定是否有資料剩下。如果在緊急(帶外)資料前有常規資料,則按序接收這些資料(請注意,recv()recvfrom()操作不會
   
在一次呼叫中混淆常規資料與帶外資料)。argp指向一個BOOL型數,ioctlsocket()在其中存入返回值。

    相容性:
  本函式為Berkeley套介面函式ioctl()的一個子集。其中沒有與FIOASYNC等價的命令,SIOCATMARK是套介面層次支援的唯一命令。

    返回值:
  成功後,ioctlsocket()返回0。否則的話,返回SOCKET_ERROR錯誤,應用程式可通過WSAGetLastError()獲取相應錯誤程式碼。

 錯誤程式碼:

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25897606/viewspace-704532/,如需轉載,請註明出處,否則將追究法律責任。