WSASocket()與Socket()的區別
WSASocket是Windows專用,支援非同步操作;
socket是unix標準,只能同步操作。
Socket可採用多執行緒實現非阻塞
winsock是socket的windows平臺的實現。winsock是微軟專門為windows作業系統開發的socket網路程式設計介面,而socket是通用網路程式設計介面。
socket() 函式建立一個通訊端點並返回一個套介面。但是在socket庫中例程在應用於阻塞套介面時會阻塞。WSASocket()的傳送操作和接收操作都可以被重疊使用。接收函式可以被多次呼叫,發出接收緩衝區,準備接收到來的資料。傳送函式也可以被多次呼叫,組成一個傳送緩衝區佇列。可是socket()卻只能發過之後等待回訊息才可做下一步操作!
[cpp] view plaincopy
- Header: Declared in Winsock2.h.
- Library: Use Ws2_32.lib.
- SOCKET WSASocket(
- int af,
- int type,
- int protocol,
- LPWSAPROTOCOL_INFO lpProtocolInfo,
- GROUP g,
- DWORD dwFlags
- );
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引數非法。