生活随笔
收集整理的這篇文章主要介紹了
【网络编程】之一、初识WinSocket
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Winsock是Windows下的網絡編程接口,它是由Unix下的BSD Socket發展而來,是一個與網絡協議無關的編程接口。
? Winsock在常見的Windows平臺上有兩個主要的版本,即Winsock1和Winsock2。編寫與Winsock1兼容的程序你需要引用頭文件WINSOCK.H,如果編寫使用Winsock2的程序,則需要引用WINSOCK2.H此外還有一個MSWSOCK.H頭文件,它是專門用來支持在Windows平臺上高性能網絡程序擴展功能的。使用WINSOCK.H頭文件時,同時需要庫文件WSOCK32.LIB,使用WINSOCK2.H時,則需要WS2_32.LIB,如果使用MSWSOCK.H中的擴展API,則需要MSWSOCK.LIB。正確引用了頭文件,并鏈接了對應的庫文件,你就構建起編寫WINSOCK網絡程序的環境了。
OK,下面我們來看看具體用法:
初始化winsocket
每個Winsock程序必須使用WSAStartup載入合適的Winsock動態鏈接庫,如果載入失敗,WSAStartup將返回SOCKET_ERROR,這個錯誤就是WSANOTINITIALISED,WSAStartup的定義如下:
[cpp]?view plaincopy
int?WSAStartup(?? ????WORD?wVersionRequested,?? ????LPWSADATA?lpWSAData?? );?? wVersionRequested指定了你想載入的
Winsock版本,其高字節指定了次版本號,而低字節指定了主版本號。你可以使用宏
MAKEWORD(x, y)來指定版本號,這里x代表主版本,而y代表次版本。lpWSAData是一個指向WSAData結構的指針,WSAStartup會向該結構中填充其載入的Winsock動態鏈庫的信息。
lpWSAData是一個指向WSAData結構的指針,WSAStartup會向該結構中填充其載入的Winsock動態鏈庫的信息。
[cpp]?view plaincopy
typedef?struct?WSAData??? {?? ????WORD???????????wVersion;????????? ????WORD???????????wHighVersion;?? 注意,它們的高字節代表次版本,低字節代表主版本。?? ????char???????????szDescription[WSADESCRIPTION_LEN?+?1];??? ????char???????????szSystemStatus[WSASYS_STATUS_LEN?+?1];?? ????unsigned?short?iMaxSockets;?? ????unsigned?short?iMaxUdpDg;?? ????char?FAR?*?????lpVendorInfo;?? 這個在Windows平臺上并沒有什么用處.?? }?WSADATA,?*?LPWSADATA;??? 當你使用完Winsock接口后,要調用下面的函數對其占用的資源進行釋放:
??
? int WSACleanup(void); 如果調用該函數失敗也沒有什么問題,因為操作系統為自動將其釋放,對應于每一個WSAStartup調用都應該有一個WSACleanup調用.
錯誤處理:
Winsock函數調用失敗大多會返回 SOCKET_ERROR(實際上就是-1),你可以調用WSAGetLastError得到錯誤的詳細信息:
[cpp]?view plaincopy
int?WSAGetLastError?(void);?? 對該函數的調用將返回一個錯誤碼,其碼值在WINSOCK.H或WINSOCK2.H(根據其版本)中已經定義,這些預定義值都以WSAE開頭.同時你還可以使用WSASetLastError來自定義錯誤碼值.
代碼示例:
下面是來自msdn的示例:
[cpp]?view plaincopy
#define?WIN32_LEAN_AND_MEAN?? ?? #include?<windows.h>?? #include?<winsock2.h>?? #include?<ws2tcpip.h>?? #include?<stdio.h>?? ?? ?? #pragma?comment(lib,?"ws2_32.lib")?? ?? ?? int?__cdecl?main()?? {?? ?? ????WORD?wVersionRequested;?? ????WSADATA?wsaData;?? ????int?err;?? ?? ?? ????wVersionRequested?=?MAKEWORD(2,?2);?? ?? ????err?=?WSAStartup(wVersionRequested,?&wsaData);?? ????if?(err?!=?0)?{?? ?????????? ?????????? ????????printf("WSAStartup?failed?with?error:?%d\n",?err);?? ????????return?1;?? ????}?? ?? ?? ?? ?? ?? ?? ?? ????if?(LOBYTE(wsaData.wVersion)?!=?2?||?HIBYTE(wsaData.wVersion)?!=?2)?{?? ?????????? ?????????? ????????printf("Could?not?find?a?usable?version?of?Winsock.dll\n");?? ????????WSACleanup();?? ????????return?1;?? ????}?? ????else?? ????????printf("The?Winsock?2.2?dll?was?found?okay\n");?? ?????????? ?? ?? ?? ?? ?? ?? ?????? ????WSACleanup();?? ?? }??
這里只是初識winsocket!大概了解一下!
2012/8/14
jofranks 于南昌
總結
以上是生活随笔為你收集整理的【网络编程】之一、初识WinSocket的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。