青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

任我行

一天一個腳印......
每日一句:
posts - 54, comments - 218, trackbacks - 1, articles - 0
  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

Winsock編程 入門

Posted on 2005-10-18 11:51 任我行 閱讀(1591) 評論(0)  編輯 收藏 引用 所屬分類: Windows編程

一、初使化Winsock


如果沒有初使化的話,所有的Winsock函數操作都回失敗(反回SOCKET_ERROR),錯誤代碼為WSANOTINITIALISED。
初使化函數:
int WSAStartup(WORD 版本號,LPWSADATA pWSADATA)
版本號的建立可以用用宏:MAKEWORD(x,y)
WSADATA結構:
{
WORD 版本
WORD 高版本
char[] 描述
char[] 系統狀態
unsigned short iMaxSockets(兼容低版本保留)
unsigned short iMaxUdpDg(兼容低版本保留)
char Far* lpVendorInfo也是兼容保留
}

這是我機子上連結后的運行情況
WSAStartup(MAKEWORD(2,2),&wsaData);
wVersion 514 unsigned short
wHighVersion 514 unsigned short
szDescription 0x0012fd18 "WinSock 2.0" char [257]
szSystemStatus 0x0012fe19 "Running" char [129]
iMaxSockets 0 unsigned short
iMaxUdpDg 0 unsigned short
lpVendorInfo 0xcccccccc <錯誤的指針> char *

514就是0x202,也是我們的版本號。最后三項被忽略了

下面一張表是各個平臺的支持的winsock版本

Platform

Winsock Version

Windows 95

1.1 (2.2)

Windows 98

2.2

Windows Me

2.2

Windows NT 4.0

2.2

Windows 2000

2.2

Windows XP

2.2

Windows CE

1.1

int WSACleanup():
終止使用Winsock函數。

二、錯誤信息

使用當Winsock函數返回SOCKET_ERROR時用int WSAGetLastError(void)檢測錯誤代碼。錯誤的代碼所對應的錯誤名稱可以在winsock.h或winsock2.h里找到。
h_errno為該指定的宏。

三、選擇一個協議

這里簡單講講通過Internet Protocol(IP)協議建立最基本的Winsock。之所以現在有很大一部分的winsock程序都用它,最主要的原因是它具有廣泛的通用性。winsock還可以用別的協議,比如IPX之類的。
   從設計上講,IP是連接協議但不是數據傳輸協議。我們可以用Two higher-level protocols-Transmision Control Protocol(TCP)或者是User Datagram Protocol(UDP),他們都是通過IP,我們一起講就是TCP/IP,UDP/IP。如果你要用IPv4(IP version 4),那你必須要要知道怎樣使用IPv4  

使用IPv4

在IPv4里面,計算機的分配的一個地址是32位,當客戶端想通過TCP或者UDP連接,那必須要知道主機的IP地址和端口。同樣,主機要監聽客戶端的請求,那必須要表明一個IP地址和端口。在Winsock里面,程序表明IP地址和服務端口信息是通過SOCKADDR_IN結構。他的聲明如下:

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

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;

sin_family必須填AF_INET告訴Winsock我們用的是IP地址
sin_port說明我們選擇哪個TCP或者UDP的端口作為我們的通訊端口,對了,有些端口號保留給一些服務,比如說FTP,HTTP等

sin_addr存儲IPV4地址用4個字節,就像無符號長整型(DWORD),IP地址在互聯網上一般用形如a.b.c.d格式。

sin_zero只不過是讓SOCKADDR_IN和SOCKADDR結構大小一樣。

下面是一個很有用的函數,把a.b.c.d格式的IP地址轉成無符號長整型。
unsigned long inet_addr(const char FAR* cp);

字節順序

不同的計算機處理數字有兩種形式,big-endian和little-endian型式(
little-endian格式的數據,例如0X12345678以(0X78 0X56 0X34 0X12)方式保存、
big-endian格式的數據,例如0X12345678以(0X12 0X34 0X56 0X78)方式保存 ),這依賴于他們是怎么設計的,比如Intel的x86處理器,多字節是用little-endian型式。IP地址和和端口在電腦中是多字節存放的,他們是host-byte順序,然而當IP地址和端口通過網絡時,必須轉成big-endian形式,也就是network-byte順序
  有一系列函數完成兩者之間的轉換。比如
host-byte序轉network-byte序
u_long htonl(u_long hostlong);
int WSAHtonl( SOCKET s, u_long hostlong, u_long FAR * lpnetlong );
u_short htons(u_short hostshort);
int WSAHtons( SOCKET s, u_short hostshort, u_short FAR * lpnetshort );

network-byte序轉host-byte序
u_long ntohl(u_long netlong);
int WSANtohl( SOCKET s, u_long netlong, u_long FAR * lphostlong );
u_short ntohs(u_short netshort);
int WSANtohs( SOCKET s, u_short netshort, u_short FAR * lphostshort );

例:
SOCKADDR_IN addr;
INT port = 8080;
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr("216.239.57.99");
addr.sin_port = htons(port);

四、建立socket

通過API SOCKET socket(int af,int type,int protocol);
第一個參數是協議的地址類別,比如我們前面講用的是IPv4,那么af就是AF_INET,
第二個參數是協議的socket類型,你用TCP/IP時,type=SOCK_STREAM,你用UDP/IP時,type=SOCK_DGRAM,
第三個參數是協議是(未詳),如果是TCP的話,則該處是IPPROTO_TCP,如果是UDP的話,則該處是IPPROTO_UDP

五、服務器API函數

服務器是一個進程,用來等待不定數目的客戶端連接,響應客戶端的請求。一個服務器必須有一個可供客戶端定位的名字,在TCP/IP里,這個名字是IP地址和端口。
第一步:用socket或者WSASocket建立socket,并用bind綁定
第二步:socket進入監聽模式。(listen)
最后:當客戶端發出請求時響應請求。(accept或者WSAAccept)

綁定(Binding)

int bind( SOCKET s, const struct sockaddr FAR* name, int namelen );
第一個參數是要綁定的socket;
第二個參數是表明你在使用的協議
第三個參數表明你指定協議地址結構的長度。

例:
SOCKET s;
SOCKADDR_IN addr;
int port = 5555;
s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
addr.sin_family = AF_INET;
addr.sin_port = htons(port);
addr.sin_addr.s_addr = htonl(INADDR_ANY);
bind(s, (SOCKADDR *)&addr, sizeof(addr));

監聽(Listening)

把socket轉成監聽模式。bind只不過是綁定,listen是告知socket進入等待進入的連接。
int listen( SOCKET s, int backlog );
第一個參數是綁定過的socket
第二個參數是最大隊列長度,比如說這個數設為二,與此同時有三個客戶連入,那么先進來的二個進入隊列,第三個則會收到WSAECONNREFUSED錯誤信息。注意服務器Accept了一個連接,這個連接就會從隊列中移除。
如果你沒bind而直接listen的話會收到 WSAEINVAL 出錯信息。

同意連接(Accepting Connectino)

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

第二個參數是你收到的客戶端地址。
第三個參數addrlen 表明addr的長度

六、客戶端API函數

第一步:建立socket
第二步:設置你要連接對象的SOCKADDR地址
第三步:用connect 或者WSAConnect連接。

TCP狀態

  起初每個socket都是CLOSED狀態,當客戶端初使化一個連接,他發送一個SYN包到服務器,客戶端進入SYN_SENT狀態。
服務器接收到SYN包,反饋一個SYN-ACK包,客戶端接收后返饋一個ACK包客戶端變成ESTABLISHED狀態,如果長時間沒收到SYN-ACK包,客戶端超時進入CLOSED狀態。
  當服務器綁定并監聽某一端口時,socket的狀態是LISTEN,當客戶企圖建立連接時,服務器收到一個SYN包,并反饋SYN-ACK包。服務器狀態變成SYN_RCVD,當客戶端發送一個ACK包時,服務器socket變成ESTABLISHED狀態。

  當一個程序在ESTABLISHED狀態時有兩種圖徑關閉它, 第一是主動關閉,第二是被動關閉。如果你要主動關閉的話,發送一個FIN包。當你的程序closesocket或者shutdown(標記),你的程序發送一個FIN包到peer,你的socket變成FIN_WAIT_1狀態。peer反饋一個ACK包,你的socket進入FIN_WAIT_2狀態。如果peer也在關閉連接,那么它將發送一個FIN包到你的電腦,你反饋一個ACK包,并轉成TIME_WAIT狀態。
  TIME_WAIT狀態又號2MSL等待狀態。MSL意思是最大段生命周期(Maximum Segment Lifetime)表明一個包存在于網絡上到被丟棄之間的時間。每個IP包有一個TTL(time_to_live),當它減到0時則包被丟棄。每個路由器使TTL減一并且傳送該包。當一個程序進入TIME_WAIT狀態時,他有2個MSL的時間,這個充許TCP重發最后的ACK,萬一最后的ACK丟失了,使得FIN被重新傳輸。在2MSL等待狀態完成后,socket進入CLOSED狀態。
  被動關閉:當程序收到一個FIN包從peer,并反饋一個ACK包,于是程序的socket轉入CLOSE_WAIT狀態。因為peer已經關閉了,所以不能發任何消息了。但程序還可以。要關閉連接,程序自已發送給自已FIN,使程序的TCP socket狀態變成LAST_ACK狀態,當程序從peer收到ACK包時,程序進入CLOSED狀態。

connect

int connect( SOCKET s, const struct sockaddr FAR* name, int namelen );
第二個參數是你要連接的名字
第三個參數是你加接的名字參數的長度

如果連接失敗了則返饋WSAECONNREFUSED錯誤。

send和WSASend

int send( SOCKET s, const char FAR * buf, int len, int flags );
第二個參數是要發送的數據。
第三個參數是發送數據的長度。
第四個參數可以是0,MSG_DONTROUTE或者是MSG_OOB,這幾個參數之間能用or連接。

正常返回:發送的字節。

int WSASend(
SOCKET s,
LPWSABUF lpBuffers,
DWORD dwBufferCount,
LPDWORD lpNumberOfBytesSent,
DWORD dwFlags,
LPWSAOVERLAPPED lpOverlapped,
LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
);

最后兩個參數用于重疊I/O,重疊I/O是一個種異步I/O模型。

WSASendDisconnect

int WSASendDisconnect ( SOCKET s, LPWSABUF lpOutboundDisconnectData );

 

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美一级淫片aaaaaaa视频| 亚洲综合大片69999| 欧美日本韩国| 欧美日韩日日骚| 欧美天堂亚洲电影院在线播放| 欧美激情一区二区三区不卡| 欧美精品在线一区二区| 欧美丝袜一区二区三区| 国产农村妇女毛片精品久久麻豆| 国产亚洲欧美另类一区二区三区| 韩日精品中文字幕| 亚洲毛片在线| 欧美一区二区视频免费观看| 久久久免费观看视频| 欧美福利一区| 亚洲伊人观看| 久久先锋资源| 欧美视频一区二区三区四区| 国产亚洲精品一区二555| 亚洲精品在线三区| 新片速递亚洲合集欧美合集| 免费观看成人鲁鲁鲁鲁鲁视频 | 精品999成人| 亚洲精选久久| 久久久91精品国产| 日韩一级欧洲| 乱人伦精品视频在线观看| 欧美午夜久久久| 亚洲福利免费| 久久国产欧美| 亚洲精品国产品国语在线app| 亚洲女女女同性video| 毛片精品免费在线观看| 国产精品黄色| 午夜在线视频观看日韩17c| 日韩视频在线一区二区| 久久国产视频网| 国产精品午夜久久| 日韩一级精品视频在线观看| 久久久免费精品| 亚洲视频在线一区| 欧美连裤袜在线视频| 亚洲国产精品一区二区第一页| 亚洲欧美日韩国产中文| 最新成人av在线| 久久久久久日产精品| 国产色综合久久| 先锋a资源在线看亚洲| 99成人免费视频| 欧美精品在线观看一区二区| 亚洲国产精品久久久久| 噜噜爱69成人精品| 久久国产日韩| 免费在线观看一区二区| 亚洲一二三四久久| 亚洲国产99| 国产小视频国产精品| 91久久国产自产拍夜夜嗨| 欧美日韩综合视频网址| 美女国产精品| 国产精品女主播在线观看| 久久免费精品视频| 欧美日韩中文字幕日韩欧美| 久久成人精品一区二区三区| 欧美精品一区二区三区高清aⅴ| 性欧美长视频| 欧美日韩在线电影| 欧美在线综合视频| 中国成人黄色视屏| 亚洲一区二区高清视频| 免费成人在线视频网站| 精品成人乱色一区二区| 久久久亚洲人| 噜噜噜91成人网| 亚洲精品乱码久久久久久黑人 | 亚洲区一区二| 亚洲国产婷婷| 欧美新色视频| 亚洲第一主播视频| 欧美精品乱码久久久久久按摩| 亚洲电影免费在线| 亚洲国产欧美一区二区三区同亚洲| 欧美区一区二区三区| 免费在线一区二区| 中国日韩欧美久久久久久久久| 99国产精品| 久久国产一二区| 国产日韩欧美一区二区三区在线观看 | 一区二区三区回区在观看免费视频| 久久久久久9999| 亚洲国产欧美一区二区三区丁香婷 | 国产精品免费网站在线观看| 久久国产主播| 久久亚洲免费| 欧美va天堂在线| 亚洲午夜精品一区二区| 欧美影院在线播放| 99国产精品久久久久久久| 亚洲视频在线观看免费| 在线播放亚洲| 亚洲视频在线一区观看| 在线免费日韩片| 亚洲视频在线观看网站| 在线免费观看日本一区| 日韩亚洲欧美综合| 一区二区在线视频| 一本色道久久综合亚洲精品按摩| 国产日韩av高清| 亚洲欧洲另类| 黄色成人在线观看| 中文在线一区| 亚洲国产精品电影| 午夜精品久久久久久久久久久| 91久久国产精品91久久性色| 亚洲资源在线观看| 夜夜嗨av一区二区三区中文字幕| 亚洲欧美日韩成人高清在线一区| 亚洲人成人一区二区在线观看| 亚洲在线观看免费视频| av成人毛片| 欧美sm重口味系列视频在线观看| 久久久7777| 亚洲欧美视频一区二区三区| 欧美激情一二区| 免费成人你懂的| 国产日韩欧美一区二区| 一区二区三区免费在线观看| 日韩视频免费| 欧美成人首页| 亚洲电影免费| 91久久精品国产91久久| 久久影音先锋| 免费一级欧美片在线观看| 国产亚洲欧美日韩美女| 亚洲性图久久| 欧美一区免费视频| 国产美女高潮久久白浆| 午夜在线电影亚洲一区| 欧美影院精品一区| 国产色爱av资源综合区| 欧美一区二区三区在线观看| 久久精品盗摄| 在线观看精品一区| 猛干欧美女孩| 亚洲人成高清| 亚洲男人的天堂在线aⅴ视频| 国产精品都在这里| 亚洲欧美另类综合偷拍| 久久久综合免费视频| 欧美午夜精品久久久久久孕妇 | 亚洲精品1区2区| 国产精品国产一区二区| 宅男噜噜噜66一区二区66| 亚洲一区在线免费| 国产精品久久久久毛片软件| 亚洲一区二区三区四区在线观看| 午夜精品福利一区二区蜜股av| 国产情侣久久| 久久一区中文字幕| 日韩香蕉视频| 欧美中文字幕视频在线观看| 国模私拍一区二区三区| 欧美成人免费网站| 亚洲香蕉网站| 欧美xx69| 午夜视频一区在线观看| 尤物yw午夜国产精品视频| 欧美国产成人精品| 亚洲欧美春色| 亚洲国产精品综合| 欧美在线影院| 99国产精品久久久久久久| 国产女优一区| 欧美精品1区| 欧美在线视频一区二区| 国产人成精品一区二区三| 欧美在线观看一区| 亚洲国产日韩在线一区模特| 午夜一区在线| 亚洲理伦在线| 一区二区三区在线免费视频 | 欧美福利电影在线观看| 亚洲视屏一区| 亚洲日本欧美| 欧美xx视频| 欧美激情自拍| 久久av一区二区三区| 亚洲精品一区二区三区蜜桃久| 国产精品国产三级国产aⅴ入口| 久久久人成影片一区二区三区观看| 日韩一级黄色片| 免费久久精品视频| 欧美在线看片| 亚洲影院免费| 99精品免费视频| 亚洲精品久久久久久久久久久久 | 欧美日本韩国一区二区三区| 久久精品国产精品亚洲综合| 亚洲一区在线观看免费观看电影高清| 亚洲国产精品一区制服丝袜|