欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
WinSock學(xué)習筆記(一)

WinSock學(xué)習筆記(一)


作者:肖進(jìn)



Socket(套接字)

◆先看定義:

typedef unsigned int u_int;typedef u_int SOCKET;

◆Socket相當于進(jìn)行網(wǎng)絡(luò )通信兩端的插座,只要對方的Socket和自己的Socket有通信聯(lián)接,雙方就可以發(fā)送和接收數據了。其定義類(lèi)似于文件句柄的定義。

◆Socket有五種不同的類(lèi)型:

1、流式套接字(stream socket)
定義:

#define SOCK_STREAM 1 

流式套接字提供了雙向、有序的、無(wú)重復的以及無(wú)記錄邊界的數據流服務(wù),適合處理大量數據。它是面向聯(lián)結的,必須建立數據傳輸鏈路,同時(shí)還必須對傳輸的數據進(jìn)行驗證,確保數據的準確性。因此,系統開(kāi)銷(xiāo)較大。

2、 數據報套接字(datagram socket)

定義:

#define SOCK_DGRAM 2 

數據報套接字也支持雙向的數據流,但不保證傳輸數據的準確性,但保留了記錄邊界。由于數據報套接字是無(wú)聯(lián)接的,例如廣播時(shí)的聯(lián)接,所以并不保證接收端是否正在偵聽(tīng)。數據報套接字傳輸效率比較高。

3、原始套接字(raw-protocol interface)

定義:

#define SOCK_RAW 3 

原始套接字保存了數據包中的完整IP頭,前面兩種套接字只能收到用戶(hù)數據。因此可以通過(guò)原始套接字對數據進(jìn)行分析。
其它兩種套接字不常用,這里就不介紹了。

◆Socket開(kāi)發(fā)所必須需要的文件(以WinSock V2.0為例):

頭文件:Winsock2.h

庫文件:WS2_32.LIB

動(dòng)態(tài)庫:W32_32.DLL

一些重要的定義

1、數據類(lèi)型的基本定義:這個(gè)大家一看就懂。

typedef unsigned char u_char;typedef unsigned short u_short;typedef unsigned int u_int;typedef unsigned long u_long;

2、 網(wǎng)絡(luò )地址的數據結構,有一個(gè)老的和一個(gè)新的的,請大家留意,如果想知道為什么,
請發(fā)郵件給Bill Gate。其實(shí)就是計算機的IP地址,不過(guò)一般不用用點(diǎn)分開(kāi)的IP地
址,當然也提供一些轉換函數。

◆ 舊的網(wǎng)絡(luò )地址結構的定義,為一個(gè)4字節的聯(lián)合:

struct in_addr {union {struct { u_char s_b1,s_b2,s_b3,s_b4; } S_un_b;struct { u_short s_w1,s_w2; } S_un_w;u_long S_addr;} S_un;#define s_addr S_un.S_addr /* can be used for most tcp & ip code *///下面幾行省略,反正沒(méi)什么用處。};

其實(shí)完全不用這么麻煩,請看下面:

◆ 新的網(wǎng)絡(luò )地址結構的定義:
非常簡(jiǎn)單,就是一個(gè)無(wú)符號長(cháng)整數 unsigned long。舉個(gè)例子:IP地址為127.0.0.1的網(wǎng)絡(luò )地址是什么呢?請看定義:

#define INADDR_LOOPBACK 0x7f000001

3、 套接字地址結構

(1)、sockaddr結構:

struct sockaddr {u_short sa_family; /* address family */char sa_data[14]; /* up to 14 bytes of direct address */};

sa_family為網(wǎng)絡(luò )地址類(lèi)型,一般為AF_INET,表示該socket在Internet域中進(jìn)行通信,該地址結構隨選擇的協(xié)議的不同而變化,因此一般情況下另一個(gè)與該地址結構大小相同的sockaddr_in結構更為常用,sockaddr_in結構用來(lái)標識TCP/IP協(xié)議下的地址。換句話(huà)說(shuō),這個(gè)結構是通用socket地址結構,而下面的sockaddr_in是專(zhuān)門(mén)針對Internet域的socket地址結構。

(2)、sockaddr_in結構

struct sockaddr_in {short sin_family;u_short sin_port;struct in_addr sin_addr;char sin_zero[8];};

sin _family為網(wǎng)絡(luò )地址類(lèi)型,必須設定為AF_INET。sin_port為服務(wù)端口,注意不要使用已固定的服務(wù)端口,如HTTP的端口80等。如果端口設置為0,則系統會(huì )自動(dòng)分配一個(gè)唯一端口。sin_addr為一個(gè)unsigned long的IP地址。sin_zero為填充字段,純粹用來(lái)保證結構的大小。

◆ 將常用的用點(diǎn)分開(kāi)的IP地址轉換為unsigned long類(lèi)型的IP地址的函數:

unsigned long inet_addr(const char FAR * cp )

用法:

unsigned long addr=inet_addr("192.1.8.84")

◆ 如果將sin_addr設置為INADDR_ANY,則表示所有的IP地址,也即所有的計算機。

#define INADDR_ANY (u_long)0x00000000

4、 主機地址:

先看定義:

struct hostent {char FAR * h_name; /* official name of host */char FAR * FAR * h_aliases; /* alias list */short h_addrtype; /* host address type */short h_length; /* length of address */char FAR * FAR * h_addr_list; /* list of addresses */#define h_addr h_addr_list[0] /* address, for backward compat */};h_name為主機名字。h_aliases為主機別名列表。h_addrtype為地址類(lèi)型。h_length為地址類(lèi)型。h_addr_list為IP地址,如果該主機有多個(gè)網(wǎng)卡,就包括地址的列表。

另外還有幾個(gè)類(lèi)似的結構,這里就不一一介紹了。

5、 常見(jiàn)TCP/IP協(xié)議的定義:

#define IPPROTO_IP 0 #define IPPROTO_ICMP 1 #define IPPROTO_IGMP 2 #define IPPROTO_TCP 6 #define IPPROTO_UDP 17 #define IPPROTO_RAW 255 

具體是什么協(xié)議,大家一看就知道了。

套接字的屬性

為了靈活使用套接字,我們可以對它的屬性進(jìn)行設定。

1、 屬性?xún)热荩?/p>
//允許調試輸出#define SO_DEBUG 0x0001 /* turn on debugging info recording *///是否監聽(tīng)模式#define SO_ACCEPTCONN 0x0002 /* socket has had listen() *///套接字與其他套接字的地址綁定#define SO_REUSEADDR 0x0004 /* allow local address reuse *///保持連接#define SO_KEEPALIVE 0x0008 /* keep connections alive *///不要路由出去#define SO_DONTROUTE 0x0010 /* just use interface addresses *///設置為廣播#define SO_BROADCAST 0x0020 /* permit sending of broadcast msgs *///使用環(huán)回不通過(guò)硬件#define SO_USELOOPBACK 0x0040 /* bypass hardware when possible *///當前拖延值#define SO_LINGER 0x0080 /* linger on close if data present *///是否加入帶外數據#define SO_OOBINLINE 0x0100 /* leave received OOB data in line *///禁用LINGER選項#define SO_DONTLINGER (int)(~SO_LINGER)//發(fā)送緩沖區長(cháng)度#define SO_SNDBUF 0x1001 /* send buffer size *///接收緩沖區長(cháng)度#define SO_RCVBUF 0x1002 /* receive buffer size *///發(fā)送超時(shí)時(shí)間#define SO_SNDTIMEO 0x1005 /* send timeout *///接收超時(shí)時(shí)間#define SO_RCVTIMEO 0x1006 /* receive timeout *///錯誤狀態(tài)#define SO_ERROR 0x1007 /* get error status and clear *///套接字類(lèi)型#define SO_TYPE 0x1008 /* get socket type */

2、 讀取socket屬性:

int getsockopt(SOCKET s, int level, int optname, char FAR * optval, int FAR * optlen)

s為欲讀取屬性的套接字。level為套接字選項的級別,大多數是特定協(xié)議和套接字專(zhuān)有的。如IP協(xié)議應為 IPPROTO_IP。

optname為讀取選項的名稱(chēng)optval為存放選項值的緩沖區指針。optlen為緩沖區的長(cháng)度

用法:

int ttl=0; //讀取TTL值int rc = getsockopt( s, IPPROTO_IP, IP_TTL, (char *)&ttl, sizeof(ttl));//來(lái)自MS platform SDK 2003

3、 設置socket屬性:

int setsockopt(SOCKET s,int level, int optname,const char FAR * optval, int optlen)

s為欲設置屬性的套接字。
level為套接字選項的級別,用法同上。
optname為設置選項的名稱(chēng)
optval為存放選項值的緩沖區指針。
optlen為緩沖區的長(cháng)度

用法:

int ttl=32; //設置TTL值int rc = setsockopt( s, IPPROTO_IP, IP_TTL, (char *)&ttl, sizeof(ttl));

套接字的使用步驟

1、啟動(dòng)Winsock:對Winsock DLL進(jìn)行初始化,協(xié)商Winsock的版本支持并分配必要的
資源。(服務(wù)器端和客戶(hù)端)

int WSAStartup( WORD wVersionRequested, LPWSADATA lpWSAData )wVersionRequested為打算加載Winsock的版本,一般如下設置:wVersionRequested=MAKEWORD(2,0)或者直接賦值:wVersionRequested=2LPWSADATA為初始化Socket后加載的版本的信息,定義如下: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, FAR * LPWSADATA;

如果加載成功后數據為:

wVersion=2表示加載版本為2.0。wHighVersion=514表示當前系統支持socket最高版本為2.2。szDescription="WinSock 2.0"szSystemStatus="Running"表示正在運行。iMaxSockets=0表示同時(shí)打開(kāi)的socket最大數,為0表示沒(méi)有限制。iMaxUdpDg=0表示同時(shí)打開(kāi)的數據報最大數,為0表示沒(méi)有限制。lpVendorInfo沒(méi)有使用,為廠(chǎng)商指定信息預留。

該函數使用方法:

WORD wVersion=MAKEWORD(2,0);WSADATA wsData;int nResult= WSAStartup(wVersion,&wsData);if(nResult !=0){//錯誤處理}

2、創(chuàng )建套接字:(服務(wù)器端和客戶(hù)端)

SOCKET socket( int af, int type, int protocol );af為網(wǎng)絡(luò )地址類(lèi)型,一般為AF_INET,表示在Internet域中使用。type為套接字類(lèi)型,前面已經(jīng)介紹了。protocol為指定網(wǎng)絡(luò )協(xié)議,一般為IPPROTO_IP。

用法:

SOCKET sock=socket(AF_INET,SOCK_STREAM,IPPROTO_IP);if(sock==INVALID_SOCKET){//錯誤處理}

3、套接字的綁定:將本地地址綁定到所創(chuàng )建的套接字上。(服務(wù)器端和客戶(hù)端)

int bind( SOCKET s, const struct sockaddr FAR * name, int namelen )s為已經(jīng)創(chuàng  )建的套接字。name為socket地址結構,為sockaddr結構,如前面討論的,我們一般使用sockaddr_in結構,在使用再強制轉換為sockaddr結構。namelen為地址結構的長(cháng)度。

用法:

sockaddr_in addr;addr. sin_family=AF_INET;addr. sin_port= htons(0); //保證字節順序addr. sin_addr.s_addr= inet_addr("192.1.8.84")int nResult=bind(s,(sockaddr*)&addr,sizeof(sockaddr));if(nResult==SOCKET_ERROR){//錯誤處理}

4、 套接字的監聽(tīng):(服務(wù)器端)

int listen(SOCKET s, int backlog )

s為一個(gè)已綁定但未聯(lián)接的套接字。
backlog為指定正在等待聯(lián)接的最大隊列長(cháng)度,這個(gè)參數非常重要,因為服務(wù)器一般可
以提供多個(gè)連接。
用法:

int nResult=listen(s,5) //最多5個(gè)連接if(nResult==SOCKET_ERROR){//錯誤處理}

5、套接字等待連接::(服務(wù)器端)

SOCKET accept( SOCKET s, struct sockaddr FAR * addr, int FAR * addrlen )

s為處于監聽(tīng)模式的套接字。
sockaddr為接收成功后返回客戶(hù)端的網(wǎng)絡(luò )地址。
addrlen為網(wǎng)絡(luò )地址的長(cháng)度。

用法:

sockaddr_in addr;SOCKET s_d=accept(s,(sockaddr*)&addr,sizeof(sockaddr));if(s==INVALID_SOCKET){//錯誤處理}

6、套接字的連結:將兩個(gè)套接字連結起來(lái)準備通信。(客戶(hù)端)

int connect(SOCKET s, const struct sockaddr FAR * name, int namelen )

s為欲連結的已創(chuàng )建的套接字。
name為欲連結的socket地址。
namelen為socket地址的結構的長(cháng)度。

用法:

sockaddr_in addr;addr. sin_family=AF_INET;addr. sin_port=htons(0); //保證字節順序addr. sin_addr.s_addr= htonl(INADDR_ANY) //保證字節順序int nResult=connect(s,(sockaddr*)&addr,sizeof(sockaddr));if(nResult==SOCKET_ERROR){//錯誤處理}

7、套接字發(fā)送數據:(服務(wù)器端和客戶(hù)端)

int send(SOCKET s, const char FAR * buf, int len, int flags )

s為服務(wù)器端監聽(tīng)的套接字。
buf為欲發(fā)送數據緩沖區的指針。
len為發(fā)送數據緩沖區的長(cháng)度。
flags為數據發(fā)送標記。
返回值為發(fā)送數據的字符數。

◆這里講一下這個(gè)發(fā)送標記,下面8中討論的接收標記也一樣:

flag取值必須為0或者如下定義的組合:0表示沒(méi)有特殊行為。

#define MSG_OOB 0x1 /* process out-of-band data */
#define MSG_PEEK 0x2 /* peek at incoming message */
#define MSG_DONTROUTE 0x4 /* send without using routing tables */
MSG_OOB表示數據應該帶外發(fā)送,所謂帶外數據就是TCP緊急數據。
MSG_PEEK表示使有用的數據復制到緩沖區內,但并不從系統緩沖區內刪除。
MSG_DONTROUTE表示不要將包路由出去。

用法:

char buf[]="xiaojin";int nResult=send(s,buf,strlen(buf));if(nResult==SOCKET_ERROR){//錯誤處理}

8、 套接字的數據接收:(客戶(hù)端)

int recv( SOCKET s, char FAR * buf, int len, int flags )

s為準備接收數據的套接字。
buf為準備接收數據的緩沖區。
len為準備接收數據緩沖區的大小。
flags為數據接收標記。
返回值為接收的數據的字符數。

用法:

char mess[1000];int nResult =recv(s,mess,1000,0);if(nResult==SOCKET_ERROR){//錯誤處理}

9、中斷套接字連接:通知服務(wù)器端或客戶(hù)端停止接收和發(fā)送數據。(服務(wù)器端和客戶(hù)端)

int shutdown(SOCKET s, int how)

s為欲中斷連接的套接字。
How為描述禁止哪些操作,取值為:SD_RECEIVE、SD_SEND、SD_BOTH。

#define SD_RECEIVE 0x00#define SD_SEND 0x01#define SD_BOTH 0x02

用法:

int nResult= shutdown(s,SD_BOTH);if(nResult==SOCKET_ERROR){//錯誤處理}

10、 關(guān)閉套接字:釋放所占有的資源。(服務(wù)器端和客戶(hù)端)

int closesocket( SOCKET s )

s為欲關(guān)閉的套接字。

用法:

int nResult=closesocket(s);if(nResult==SOCKET_ERROR){//錯誤處理}
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
跨平臺(Windows+Linux)的Socket通訊程序(一)—底層封裝(轉)
socket套接字TCP編程實(shí)例
網(wǎng)絡(luò )編程里幾個(gè)結構 in
Linux環(huán)境下的Socket編程 - C&C - Linux技術(shù)中堅站
POSIX Socket編程
Linux編程常用的函數(八) 網(wǎng)絡(luò )編程
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久