日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【网络编程】之一、初识WinSocket

發布時間:2024/4/11 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【网络编程】之一、初识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;???????//wVersion為你將使用的Winsock版本號??
  • ????WORD???????????wHighVersion;//wHighVersion為載入的Winsock動態庫支持的最高版本,??
  • 注意,它們的高字節代表次版本,低字節代表主版本。??
  • ????char???????????szDescription[WSADESCRIPTION_LEN?+?1];???
  • ????char???????????szSystemStatus[WSASYS_STATUS_LEN?+?1];//上面兩個變量由特定版本的Winsock設置,實際上沒有太大用處。??
  • ????unsigned?short?iMaxSockets;//表示最大數量的并發Sockets,其值依賴于可使用的硬件資源。??
  • ????unsigned?short?iMaxUdpDg;//?iMaxUdpDg表示數據報的最大長度??
  • ????char?FAR?*?????lpVendorInfo;//是為Winsock實現而保留的制造商信息,??
  • 這個在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>??
  • ??
  • //?Need?to?link?with?Ws2_32.lib??
  • #pragma?comment(lib,?"ws2_32.lib")??
  • ??
  • ??
  • int?__cdecl?main()??
  • {??
  • ??
  • ????WORD?wVersionRequested;??
  • ????WSADATA?wsaData;??
  • ????int?err;??
  • ??
  • /*?Use?the?MAKEWORD(lowbyte,?highbyte)?macro?declared?in?Windef.h?*/??
  • ????wVersionRequested?=?MAKEWORD(2,?2);??
  • ??
  • ????err?=?WSAStartup(wVersionRequested,?&wsaData);??
  • ????if?(err?!=?0)?{??
  • ????????/*?Tell?the?user?that?we?could?not?find?a?usable?*/??
  • ????????/*?Winsock?DLL.??????????????????????????????????*/??
  • ????????printf("WSAStartup?failed?with?error:?%d\n",?err);??
  • ????????return?1;??
  • ????}??
  • ??
  • /*?Confirm?that?the?WinSock?DLL?supports?2.2.*/??
  • /*?Note?that?if?the?DLL?supports?versions?greater????*/??
  • /*?than?2.2?in?addition?to?2.2,?it?will?still?return?*/??
  • /*?2.2?in?wVersion?since?that?is?the?version?we??????*/??
  • /*?requested.????????????????????????????????????????*/??
  • ??
  • ????if?(LOBYTE(wsaData.wVersion)?!=?2?||?HIBYTE(wsaData.wVersion)?!=?2)?{??
  • ????????/*?Tell?the?user?that?we?could?not?find?a?usable?*/??
  • ????????/*?WinSock?DLL.??????????????????????????????????*/??
  • ????????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");??
  • ??????????
  • ??
  • /*?The?Winsock?DLL?is?acceptable.?Proceed?to?use?it.?*/??
  • ??
  • /*?Add?network?programming?using?Winsock?here?*/??
  • ??
  • /*?then?call?WSACleanup?when?done?using?the?Winsock?dll?*/??
  • ??????
  • ????WSACleanup();??
  • ??
  • }??

  • 這里只是初識winsocket!大概了解一下!

    2012/8/14

    jofranks 于南昌

    總結

    以上是生活随笔為你收集整理的【网络编程】之一、初识WinSocket的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。