999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

使用WINSOCK 實現Windows下網絡通信

2013-04-29 00:53:31肖季烈肖維
知識窗·教師版 2013年9期

肖季烈 肖維

摘要:本文介紹了Sockets通信原理,從程序員的角度著重討論了Windows Sockets的功能擴充,并列舉了運用 Windows Sockets實現網絡實時通信的一個程序實例。

關鍵詞:Windows Sockets 異步通信 阻塞

一、Socket網絡編程原理

Socket是BSD UNIX提供的網絡應用編程接口,它采用客戶——服務器的通訊機制,使網絡客戶方和服務器方通過Socket實現網絡之間的連接和數據交換。Socket提供了一系列的系統調用,可以實現TCP、UDP、ICMP和IP等多種網絡協議之間的通訊。

Socket有三種主要類型:Stream sockets、Datagram sockets 和Raw sockets。Stream socket接口定義了一種可靠的面向連接的服務,實現了無差錯、無重復的順序數據傳輸,它通過內置的流量控制解決了數據的擁堵,應用程序可以發送任意長度的數據;Datagram socket接口定義了一種無連接的服務,數據通過相互獨立的包進行傳輸,包的傳輸是無序的,但是不能保證包的正確率。包長度是有限的(隱含長度為8,192字節,最大長度可設為32,768字節);Raw socket接口允許對低層協議(如IP和ICMP)的直接存取,它主要用于實現新網絡協議的測試等。

下面,我們通過一個面向連接的傳輸發生的典型情況來說明Socket網絡通信的實現。

從圖1中我們可以看出,客戶和服務器的關系不是對稱的,服務器首先啟動,然后在某一時間 從

從圖1中我們可以看出,客戶與服務器的關系不是對稱的,服務器首先啟動,然后在某一時間啟動客戶與服務器的連接。服務器和客戶開始都必須用調用socket()建立一個套接字(socket),然后服務器調用bind()將套接字與一個本地網絡地址捆綁在一起,再用調用listen()使套接字處于一種被動的準備接收狀態,同時規定它的請求隊列長度,之后服務器就可以調用accept()來接收連接了。客戶在建立套接字之后,就可以通過調用connect()和服務器建立連接。建立連接后,客戶和服務器之間就可以通過連接發送和接收數據(調用read()和write())。最后,待數據傳送結束,雙方調用close()關閉套接字。

二、WINSOCK對Socket的擴充

BSD Socket支持阻塞(blocking)和非阻塞(non_blocking)兩種工作方式。在阻塞方式下工作,connect()、accept()、read()和recv()等調用在執行時都處于阻塞狀態,直到它成功或出錯返回;在非阻塞方式下工作,這些調用是立即返回的,但是必須通過查詢才能知道它們是否完成。

WINSOCK對BSD Socket的擴充主要基于消息、對網絡事件的異步存取接口上。表1列出了WINSOCK擴充的函數功能。

從表1中我們可以看出,WINSOCK的擴充功能可以分為如下幾類:

1.異步選擇機制

異步選擇函數WSAAsyncSelect()允許應用程序提名一個或多個感興趣的網絡事件,所有非阻塞的網絡I/O例程(如send()和resv()),不管它是已經使用,還是即將使用,都可作為WSAAsyncSelect()函數選擇的候選。當被提名的網絡事件發生時,Windows應用程序的窗口函數將收到一個消息,消息附帶的參數指示被提名過的某一網絡事件。

2.異步請求例程

異步請求例程允許應用程序用異步方式獲取請求的信息,如WSAAsyncGetXByY()類函數允許用戶請求異步服務,這些功能在使用標準Berkeley函數時是阻塞的。

3.阻塞處理方法

WINSOCK在調用處于阻塞時會進入一個叫“Hook”的例程,它負責處理Windows消息,使得Windows的消息循環能夠繼續。WINSOCK還提供了兩個函數[WSASetBlockingHook()和WSAUnhookBlockingHook()]讓用戶能夠設置和取消自己的阻塞處理例程。另外,函數WSAIsBlocking()可以檢測調用是否阻塞,函數WSACancelBlockingCall()可以取消一個阻塞的調用。

4.出錯處理

為了和以后的多線索環境(如Windows/NT)兼容,WINSOCK提供了兩個出錯處理函數WSAGetLastError()和WSASetLastError()來獲取和設置本線索的最近錯誤號。

5.啟動與終止

WINSOCK的應用程序在使用上述WINSOCK函數前,必須先調用WSAStartup()函數對Windows Sockets DLL進行初始化,以協商WINSOCK的版本支持,并分配必要的資源。在應用程序退出之前,應該先調用函數WSAClearnup()終止對Windows Sockets DLL的使用,并釋放資源,將有利于下一次使用。

三、網絡實時通信的實現

我們來設計一個簡單的基于連接的點對點網絡實時通信程序:服務器首先啟動,它建立套接字之后等待客戶的連接;客戶在啟動后建立套接字,然后和服務器建立連接;連接建立后,客戶通過連接給服務器發送一段數據,服務器接收后又將它發送回來,客戶再發送,如此循環,直至用戶命令客戶退出或網絡出錯;客戶關閉連接和套接字后退出,服務器在檢測到連接關閉后,關閉套接字自動結束。

我們的實例是UNIX下基于BSD Socket的服務器程序和Windows下基于WINSOCK的客戶程序之間的通信。我們先來看客戶程序,首先定義幾個宏、菜單資源和部分全局變量:

程序1:部分Windows程序源代碼(宏、菜單和變量)

#define USERPORT3333/* 用戶定義端口號 */

#define IDM_START 101/* “啟動”菜單項標志 */

#define IDM_EXIT102 /* “退出”菜單項標志 */

#define UM_SOCK WM_USER+0x100/* 用戶定義網絡消息 */

ClientMenu MENU/* 客戶菜單 */

BEGIN

POPUP "&Server"

BEGIN

MENUITEM "&Start...", IDM_START

MENUITEM "S&top", IDM_STOP

END

END

#include/* 必須包含winsock.h頭文件 */

HANDLE hInst;

char server_address[256] = {0}; /* 服務器地址緩沖區 */

char buffer[1024]; /* 接收發送緩沖區 */

char FAR * lpBuffer = &buffer[0];

SOCKET s = 0; /* 套接字 */

struct sockaddr_in dst_addr;/* 目標地址 */

struct hostent *hostaddr; /* 主機地址 */

struct hostent hostnm;

int count = 0;/* 發送接收循環計數器 */

客戶程序的窗口主函數很簡單,它在注冊窗口類、建立窗口后,只是給主窗口函數發送一個用戶消息,然后就進入Windows消息處理循環。

程序2:部分Windows程序源代碼(窗口主函數)

int PASCAL WinMain( HANDLE hInstance,HANDLE hPrevInstance,LPSTR lpCmdLine, int nCmdShow)

{

HWND hWnd;

MSG msg;

lstrcpy((LPSTR) server_address, lpCmdLine); /* 取主機名字 */

if (!hPrevInstance)

if (!InitApplication(hInstance))

return (FALSE);

hInst = hInstance;

hWnd = CreateWindow("ClientClass","Windows ECHO Client",

WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,

CW_USEDEFAULT,CW_USEDEFAULT,

NULL, NULL, hInstance, NULL);

if (!hWnd)

return (FALSE);

ShowWindow(hWnd, nCmdShow);

UpdateWindow(hWnd);

/* 給主窗口函數發送WM_USER消息 */

PostMessage(hWnd,WM_USER,(WPARAM) 0, (LPARAM) 0);

while (GetMessage(&msg, NULL, NULL, NULL)) {

TranslateMessage(&msg);

DispatchMessage(&msg);

}

return (msg.wParam);

}

我們用最簡單的語句編制一個UNIX下基于BSD SOCKET的服務器程序,它在建立連接后,只負責將收到的數據發回去,在連接斷開后,服務器關閉套接字返回。

四、結束語

我們可以看出,WINSOCK提供的異步選擇機制使Socket強大的網絡編程功能能夠在Windows下得到應用。相信隨著INTERNET的推廣,TCP/IP網絡協議的廣泛使用,使用WINSOCK編制Windows網絡實時通信軟件將能得到較大的發展。

參考文獻:

[1]孫義等,UNIX環境下的網絡程序設計[M].北京:希望公司,1991.

[2]梁振軍等,新編TCP/IP協議與計算機網絡互聯技術[M].北京:希望公司,1992.

(作者單位:江西省萍鄉市萍鄉廣播電視大學)

主站蜘蛛池模板: 三级欧美在线| 99精品在线看| 无码国产伊人| 手机永久AV在线播放| 免费AV在线播放观看18禁强制| 国产va在线| 中文字幕1区2区| 亚洲av无码人妻| 日韩国产一区二区三区无码| 午夜福利无码一区二区| 91丝袜乱伦| 91欧美亚洲国产五月天| 就去色综合| 国产成人综合在线观看| 人妖无码第一页| 日韩欧美综合在线制服| 在线观看亚洲精品福利片| 国产成人毛片| 福利姬国产精品一区在线| 久久免费视频6| 天天躁夜夜躁狠狠躁躁88| 中文字幕在线不卡视频| 免费女人18毛片a级毛片视频| 综合人妻久久一区二区精品| 一级一级一片免费| 亚洲乱强伦| 成人免费午间影院在线观看| 国产日本欧美在线观看| 色爽网免费视频| 欧美翘臀一区二区三区| 精品国产一区91在线| 国产乱子伦手机在线| 亚洲国产精品成人久久综合影院| 国产精品视频观看裸模 | 国产玖玖视频| 亚洲欧美一级一级a| 日韩精品少妇无码受不了| 情侣午夜国产在线一区无码| 精品久久久久久成人AV| 毛片视频网| 国产欧美在线| 亚洲天堂久久| 欧美日韩一区二区在线免费观看| 国产成人一级| 成人在线综合| 无码专区国产精品一区| 国产成人综合网在线观看| 超碰aⅴ人人做人人爽欧美| 久久人搡人人玩人妻精品| 中文纯内无码H| 成人精品午夜福利在线播放| 国产成年女人特黄特色毛片免| 激情爆乳一区二区| 亚洲国产日韩欧美在线| 欧洲欧美人成免费全部视频| 欧美日韩成人在线观看| 久久夜色精品国产嚕嚕亚洲av| jizz在线免费播放| 亚洲丝袜中文字幕| 美女无遮挡免费视频网站| 亚洲色图欧美一区| 人妻一本久道久久综合久久鬼色| 国产成人精品优优av| 国产区精品高清在线观看| 久久久久久久久久国产精品| 亚洲一区二区三区香蕉| 色悠久久综合| 欧美成人精品高清在线下载 | 亚洲精品无码高潮喷水A| 亚洲人妖在线| 午夜一区二区三区| 中文字幕日韩视频欧美一区| 亚洲人成在线精品| 青青操视频免费观看| 国产男人的天堂| 欧美精品伊人久久| 日韩第九页| 国内精品九九久久久精品| 亚卅精品无码久久毛片乌克兰| 国产女人水多毛片18| 亚洲男人的天堂视频| 日本高清免费一本在线观看|