程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> WinSock網絡編程基礎(1),winsock網絡編程基礎

WinSock網絡編程基礎(1),winsock網絡編程基礎

編輯:C++入門知識

WinSock網絡編程基礎(1),winsock網絡編程基礎


記錄學習windows網絡編程過程中遇到的問題和相關筆記

 

基本概念:

 

Socket:

socket起源於UNIX,Socket是應用層與TCP/IP協議族通信的中間軟件抽象層,它是一組接口。基於"打開—讀/寫—關閉"模式,其中WinSock就是變種之一

 

以下是一個典型的C/S中使用套接字接口的概述:

 

WinSock:

WinSock是Windows平台下的網絡編程接口,它是基於Unix下的BSD Socket發展而來,是一個與網絡協議無關的編程接口。

WinSock目前有兩個版本:

 

Winsock 1: Windows CE平台支持; 頭文件:WinSock.h ; lib庫:wsock32.lib

 

Winsock 2: 部分平台不支持。通過前綴WSA可以區別於Winsock 1版本。個別函數如WSAStartup、WSACleanup、WSARecvEx、WSAGetLastError都屬於Winsock 1.1規范的函數; 頭文件:WinSock2.h; lib庫:ws2_32.lib

 

初始化WinSock:所有需要調用WinSock函數的程序都必須初始化WinSock,同時確保winsock支持該系統

#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif
#include <windows.h>
#include <WinSock2.h>
#include <WS2tcpip.h>
#include <IPHlpApi.h>
#include <stdio.h>
#pragma comment(lib, "Ws2_32.lib")

int main()
{
	WSADATA wsaData;
	int iResult;
	iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
	if (iResult != 0)
	{
		printf("WSAStartup failed: %d\n", iResult);
		return 1;
	}
	WSACleanup();
	return 0;
}

 

WSAStartup()函數使用合適的的winsock動態鏈接庫,成功就返回0

int WSAStartup(
  _In_  WORD      wVersionRequested,
  _Out_ LPWSADATA lpWSAData
);

 

wVersionRequested指定了你想載入的Winsock版本,其高字節指定了次版本號,而低字節指定了主版本號。可以使用宏MAKEWORD(x, y)來指定版本號,這裡x代表主版本,而y代表次版本。lpWSAData是一個指向WSAData結構的指針,WSAStartup會向該結構中填充其載入的Winsock動態鏈接庫

 

WSADATA結構:

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;
} WSADATA, *LPWSADATA;

wVersion為你將使用的Winsock版本號,wHighVersion為載入的Winsock動態庫支持的最高版本,它們的高字節代表次版本,低字節代表主版本。

 

szDescription與szSystemStatus由特定版本的Winsock設置

 

iMaxSockets表示最大數量的並發Sockets,其值依賴於可使用的硬件資源。


iMaxUdpDg表示數據報的最大長度;然而,獲取數據報的最大長度,需要使用WSAEnumProtocols對協議進行查詢。


lpVendorInfo是為Winsock實現而保留的制造商信息,這個在Windows平台上並沒有什麼用處.

 

Windows 95以後的操作系統都支持Winsock 2.2的版本.

 

WSACleanup() :對占用的資源進行釋放,如果調用該函數失敗,操作系統為自動將其釋放,對應於每一個WSAStartup調用都應該有一個WSACleanup調用.

 原文鏈接: http://www.bugcoding.com/entry/9

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved