1. 程式人生 > >WSASocket()與Socket()的區別

WSASocket()與Socket()的區別

WSASocket是Windows專用,支援非同步操作;
socket是unix標準,只能同步操作。

Socket可採用多執行緒實現非阻塞

 

winsock是socket的windows平臺的實現。winsock是微軟專門為windows作業系統開發的socket網路程式設計介面,而socket是通用網路程式設計介面。

socket() 函式建立一個通訊端點並返回一個套介面。但是在socket庫中例程在應用於阻塞套介面時會阻塞。WSASocket()的傳送操作和接收操作都可以被重疊使用。接收函式可以被多次呼叫,發出接收緩衝區,準備接收到來的資料。傳送函式也可以被多次呼叫,組成一個傳送緩衝區佇列。可是socket()卻只能發過之後等待回訊息才可做下一步操作!

 

[cpp] view plaincopy

  1. Header: Declared in Winsock2.h.  
  2. Library: Use Ws2_32.lib.  
  3.   
  4. SOCKET WSASocket(  
  5.   int af,  
  6.   int type,  
  7.   int protocol,  
  8.   LPWSAPROTOCOL_INFO lpProtocolInfo,  
  9.   GROUP g,  
  10.   DWORD dwFlags  
  11. );   

 

 

af:地址族描述。目前僅支援PF_INET格式,亦即ARPA Internet地址格式。
type:新套介面的型別描述。
protocol:套介面使用的特定協議,如果呼叫者不願指定協議則定為0。
lpProtocolInfo:一個指向PROTOCOL_INFO結構的指標,該結構定義所建立套介面的特性。如果本引數非零,則前三個引數(af, type, protocol)被忽略。

 g:套介面組的描述字。
iFlags:套介面屬性描述。

 

返回值:
  若無錯誤發生,WSASocket()返回新套介面的描述字。否則的話,返回 INVALID_SOCKET,應用程式可以呼叫WSAGetLastError()來獲取相應的錯誤程式碼。

 

錯誤程式碼:
  WSANOTINITIALISED                在呼叫本API之前應成功呼叫WSAStartup()。
  WSAENETDOWN                      網路子系統失效。
  WSAEAFNOSUPPORT              不支援指定的地址族。
  WSAEINPROGRESS                 一個阻塞的WinSock呼叫正在進行中,或者服務提供者仍在處理一個回撥函式
  WSAEMFILE                              無可用的套介面描述字。
  WSAENOBUFS                          無可用的緩衝區空間。套介面無法建立。
  WSAEPROTONOSUPPORT      不支援指定的協議。
  WSAEPROTOTYPE                  指定的協議對於本套介面型別錯誤。
  WSAESOCKTNOSUPPORT      本地址族不支援指定的套介面型別。
  WSAEINVAL                               g引數非法。