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

道。道。道

安全特性不等于安全的特性

   :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理

常用鏈接

搜索

  •  

最新評(píng)論

  摘要:在Windows 95環(huán)境下,基于TCP/IP協(xié)議,用Winsock完成了話音的端到端傳輸。采用雙套接字技術(shù),闡述了主要函數(shù)的使用要點(diǎn),以及基于異步選擇機(jī)制的應(yīng)用方法。同時(shí),給出了相應(yīng)的實(shí)例程序。

  一、引言

  Windows 95作為微機(jī)的操作系統(tǒng),已經(jīng)完全融入了網(wǎng)絡(luò)與通信功能,不僅可以建立純Windows 95環(huán)境下的“對(duì)等網(wǎng)絡(luò)”,而且支持多種協(xié)議,如TCP/IP、IPX/SPX、NETBUI等。在TCP/IP協(xié)議組中,TPC是一種面向連接的協(xié)義,為用戶提供可靠的、全雙工的字節(jié)流服務(wù),具有確認(rèn)、流控制、多路復(fù)用和同步等功能,適于數(shù)據(jù)傳輸。UDP協(xié)議則是無(wú)連接的,每個(gè)分組都攜帶完整的目的地址,各分組在系統(tǒng)中獨(dú)立傳送。它不能保證分組的先后順序,不進(jìn)行分組出錯(cuò)的恢復(fù)與重傳,因此不保證傳輸?shù)目煽啃裕牵峁└邆鬏斝实臄?shù)據(jù)報(bào)服務(wù),適于實(shí)時(shí)的語(yǔ)音、圖像傳輸、廣播消息等網(wǎng)絡(luò)傳輸。

  Winsock接口為進(jìn)程間通信提供了一種新的手段,它不但能用于同一機(jī)器中的進(jìn)程之間通信,而且支持網(wǎng)絡(luò)通信功能。隨著Windows 95的推出。Winsock已經(jīng)被正式集成到了Windows系統(tǒng)中,同時(shí)包括了16位和32位的編程接口。而Winsock的開(kāi)發(fā)工具也可以在Borland C++4.0、Visual C++2.0這些C編譯器中找到,主要由一個(gè)名為winsock.h的頭文件和動(dòng)態(tài)連接庫(kù)winsock.dll或wsodk32.dll組成,這兩種動(dòng)態(tài)連接庫(kù)分別用于Win16和Win32的應(yīng)用程序。

  本文針對(duì)話音的全雙工傳輸要求,采用UDP協(xié)議實(shí)現(xiàn)了實(shí)時(shí)網(wǎng)絡(luò)通信。使用VisualC++2.0編譯環(huán)境,其動(dòng)態(tài)連接庫(kù)名為wsock32.dll。

  二、主要函數(shù)的使用要點(diǎn)

  通過(guò)建立雙套接字,可以很方便地實(shí)現(xiàn)全雙工網(wǎng)絡(luò)通信。

  1.套接字建立函數(shù):

SOCKET socket(int family,int type,int protocol)

  對(duì)于UDP協(xié)議,寫為:

SOCKRET s;
s=socket(AF_INET,SOCK_DGRAM,0);
或s=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP)

  為了建立兩個(gè)套接字,必須實(shí)現(xiàn)地址的重復(fù)綁定,即,當(dāng)一個(gè)套接字已經(jīng)綁定到某本地地址后,為了讓另一個(gè)套接字重復(fù)使用該地址,必須為調(diào)用bind()函數(shù)綁定第二個(gè)套接字之前,通過(guò)函數(shù)setsockopt()為該套接字設(shè)置SO_REUSEADDR套接字選項(xiàng)。通過(guò)函數(shù)getsockopt()可獲得套接字選項(xiàng)設(shè)置狀態(tài)。需要注意的是,兩個(gè)套接字所對(duì)應(yīng)的端口號(hào)不能相同。此外,還涉及到套接字緩沖區(qū)的設(shè)置問(wèn)題,按規(guī)定,每個(gè)區(qū)的設(shè)置范圍是:不小于512個(gè)字節(jié),大大于8k字節(jié),根據(jù)需要,文中選用了4k字節(jié)。

  2.套接字綁定函數(shù)

int bind(SOCKET s,struct sockaddr_in*name,int namelen)

  s是剛才創(chuàng)建好的套接字,name指向描述通訊對(duì)象的結(jié)構(gòu)體的指針,namelen是該結(jié)構(gòu)體的長(zhǎng)度。該結(jié)構(gòu)體中的分量包括:IP地址(對(duì)應(yīng)name.sin_addr.s_addr)、端口號(hào)(name.sin_port)、地址類型(name.sin_family,一般都賦成AF_INET,表示是internet地址)。

  (1)IP地址的填寫方法:在全雙工通信中,要把用戶名對(duì)應(yīng)的點(diǎn)分表示法地址轉(zhuǎn)換成32位長(zhǎng)整數(shù)格式的IP地址,使用inet_addr()函數(shù)。

  (2)端口號(hào)是用于表示同一臺(tái)計(jì)算機(jī)不同的進(jìn)程(應(yīng)用程序),其分配方法有兩種:1)進(jìn)程可以讓系統(tǒng)為套接字自動(dòng)分配一端口號(hào),只要在調(diào)用bind前將端口號(hào)指定為0即可。由系統(tǒng)自動(dòng)分配的端口號(hào)位于1024~5000之間,而1~1023之間的任一TCP或UDP端口都是保留的,系統(tǒng)不允許任一進(jìn)程使用保留端口,除非其有效用戶ID是零(超級(jí)用戶)。

  2)進(jìn)程可為套接字指定一特定端口。這對(duì)于需要給套接字分配一眾所端口的服務(wù)器是很有用的。指定范圍為1024和65536之間。可任意指定。

  在本程序中,對(duì)兩個(gè)套接字的端口號(hào)規(guī)定為2000和2001,前者對(duì)應(yīng)發(fā)送套接字,后者對(duì)應(yīng)接收套接字。

  端口號(hào)要從一個(gè)16位無(wú)符號(hào)數(shù)(u_short類型數(shù))從主機(jī)字節(jié)順序轉(zhuǎn)換成網(wǎng)絡(luò)字節(jié)順序,使用htons()函數(shù)。

  根據(jù)以上兩個(gè)函數(shù),可以給出雙套接字建立與綁定的程序片斷。

//設(shè)置有關(guān)的全局變量
SOCKET sr,ss;
HPSTR sockBufferS,sockBufferR;
HANDLE hSendData,hReceiveData;
DWROD dwDataSize=1024*4;
struct sockaddr_in therel.there2;
#DEFINE LOCAL_HOST_ADDR 200.200.200.201
#DEFINE REMOTE_HOST-ADDR 200.200.200.202
#DEFINE LOCAL_HOST_PORT 2000
#DEFINE LOCAL_HOST_PORT 2001
//套接字建立函數(shù)
BOOL make_skt(HWND hwnd)
{
struct sockaddr_in here,here1;
ss=socket(AF_INET,SOCK_DGRAM,0);
sr=socket(AF_INET,SOCK_DGRAM,0);
if((ss==INVALID_SOCKET)||(sr==INVALID_SOCKET))
{
MessageBox(hwnd,“套接字建立失敗!”,“”,MB_OK);
return(FALSE);
}
here.sin_family=AF_INET;
here.sin_addr.s_addr=inet_addr(LOCAL_HOST_ADDR);
here.sin_port=htons(LICAL_HOST_PORT);
//another socket
herel.sin_family=AF_INET;
herel.sin_addr.s_addr(LOCAL_HOST_ADDR);
herel.sin_port=htons(LOCAL_HOST_PORT1);
SocketBuffer();//套接字緩沖區(qū)的鎖定設(shè)置
setsockopt(ss,SOL_SOCKET,SO_SNDBUF,(char FAR*)sockBufferS,dwDataSize);
if(bind(ss,(LPSOCKADDR)&here,sizeof(here)))
{
MessageBox(hwnd,“發(fā)送套接字綁定失敗!”,“”,MB_OK);
return(FALSE);
}
setsockopt(sr SQL_SOCKET,SO_RCVBUF|SO_REUSEADDR,(char FAR*)
sockBufferR,dwDataSize);
if(bind(sr,(LPSOCKADDR)&here1,sizeof(here1)))
{
MessageBox(hwnd,“接收套接字綁定失敗!”,“”,MB_OK);
return(FALSE);
}
return(TRUE);
}
//套接字緩沖區(qū)設(shè)置
void sockBuffer(void)
{
hSendData=GlobalAlloc(GMEM_MOVEABLE|GMEM_SHARE,dwDataSize);
if(!hSendData)
{
MessageBox(hwnd,“發(fā)送套接字緩沖區(qū)定位失敗!”,NULL,
MB_OK|MB_ICONEXCLAMATION);
return;
}
if((sockBufferS=GlobalLock(hSendData)==NULL)
{
MessageBox(hwnd,“發(fā)送套接字緩沖區(qū)鎖定失敗!”,NULL,
MB_OK|MB_ICONEXCLAMATION);
GlobalFree(hRecordData[0];
return;
}
hReceiveData=globalAlloc(GMEM_MOVEABLE|GMEM_SHARE,dwDataSize);
if(!hReceiveData)
{
MessageBox(hwnd,"“接收套接字緩沖區(qū)定位敗!”,NULL
MB_OK|MB_ICONEXCLAMATION);
return;
}
if((sockBufferT=Globallock(hReceiveData))=NULL)
MessageBox(hwnd,"發(fā)送套接字緩沖區(qū)鎖定失敗!”,NULL,
MB_OK|MB_ICONEXCLAMATION);
GlobalFree(hRecordData[0]);
return;
}
{

  3.數(shù)據(jù)發(fā)送與接收函數(shù);

int sendto(SOCKET s.char*buf,int len,int flags,struct sockaddr_in to,int
tolen);
int recvfrom(SOCKET s.char*buf,int len,int flags,struct sockaddr_in
fron,int*fromlen)

  其中,參數(shù)flags一般取0。

  recvfrom()函數(shù)實(shí)際上是讀取sendto()函數(shù)發(fā)過(guò)來(lái)的一個(gè)數(shù)據(jù)包,當(dāng)讀到的數(shù)據(jù)字節(jié)少于規(guī)定接收的數(shù)目時(shí),就把數(shù)據(jù)全部接收,并返回實(shí)際接收到的字節(jié)數(shù);當(dāng)讀到的數(shù)據(jù)多于規(guī)定值時(shí),在數(shù)據(jù)報(bào)文方式下,多余的數(shù)據(jù)將被丟棄。而在流方式下,剩余的數(shù)據(jù)由下recvfrom()讀出。為了發(fā)送和接收數(shù)據(jù),必須建立數(shù)據(jù)發(fā)送緩沖區(qū)和數(shù)據(jù)接收緩沖區(qū)。規(guī)定:IP層的一個(gè)數(shù)據(jù)報(bào)最大不超過(guò)64K(含數(shù)據(jù)報(bào)頭)。當(dāng)緩沖區(qū)設(shè)置得過(guò)多、過(guò)大時(shí),常因內(nèi)存不夠而導(dǎo)致套接字建立失敗。在減小緩沖區(qū)后,該錯(cuò)誤消失。經(jīng)過(guò)實(shí)驗(yàn),文中選用了4K字節(jié)。

  此外,還應(yīng)注意這兩個(gè)函數(shù)中最后參數(shù)的寫法,給sendto()的最后參數(shù)是一個(gè)整數(shù)值,而recvfrom()的則是指向一整數(shù)值的指針。

  4.套接字關(guān)閉函數(shù):closesocket(SOCKET s)

  通訊結(jié)束時(shí),應(yīng)關(guān)閉指定的套接字,以釋與之相關(guān)的資源。

  在關(guān)閉套接字時(shí),應(yīng)先對(duì)鎖定的各種緩沖區(qū)加以釋放。其程序片斷為:

void CloseSocket(void)
{
GlobalUnlock(hSendData);
GlobalFree(hSenddata);
GlobalUnlock(hReceiveData);
GlobalFree(hReceiveDava);
if(WSAAysncSelect(ss,hwnd,0,0)=SOCKET_ERROR)
{
MessageBos(hwnd,“發(fā)送套接字關(guān)閉失敗!”,“”,MB_OK);
return;
}
if(WSAAysncSelect(sr,hwnd,0,0)==SOCKET_ERROR)
{
MessageBox(hwnd,“接收套接字關(guān)閉失敗!”,“”,MB_OK);
return;
}
WSACleanup();
closesockent(ss);
closesockent(sr);
return;
}

  三、Winsock的編程特點(diǎn)與異步選擇機(jī)制

  1 阻塞及其處理方式

  在網(wǎng)絡(luò)通訊中,由于網(wǎng)絡(luò)擁擠或一次發(fā)送的數(shù)據(jù)量過(guò)大等原因,經(jīng)常會(huì)發(fā)生交換的數(shù)據(jù)在短時(shí)間內(nèi)不能傳送完,收發(fā)數(shù)據(jù)的函數(shù)因此不能返回,這種現(xiàn)象叫做阻塞。Winsock對(duì)有可能阻塞的函數(shù)提供了兩種處理方式:阻塞和非阻塞方式。在阻塞方式下,收發(fā)數(shù)據(jù)的函數(shù)在被調(diào)用后一直要到傳送完畢或者出錯(cuò)才能返回。在阻塞期間,被阻的函數(shù)不會(huì)斷調(diào)用系統(tǒng)函數(shù)GetMessage()來(lái)保持消息循環(huán)的正常進(jìn)行。對(duì)于非阻塞方式,函數(shù)被調(diào)用后立即返回,當(dāng)傳送完成后由Winsock給程序發(fā)一個(gè)事先約定好的消息。

  在編程時(shí),應(yīng)盡量使用非阻塞方式。因?yàn)樵谧枞绞较拢脩艨赡軙?huì)長(zhǎng)時(shí)間的等待過(guò)程中試圖關(guān)閉程序,因?yàn)橄⒀h(huán)還在起作用,所以程序的窗口可能被關(guān)閉,這樣當(dāng)函數(shù)從Winsock的動(dòng)態(tài)連接庫(kù)中返回時(shí),主程序已經(jīng)從內(nèi)存中刪除,這顯然是極其危險(xiǎn)的。

  2 異步選擇函數(shù)WSAAsyncSelect()的使用

  Winsock通過(guò)WSAAsyncSelect()自動(dòng)地設(shè)置套接字處于非阻塞方式。使用WindowsSockets實(shí)現(xiàn)Windows網(wǎng)絡(luò)程序設(shè)計(jì)的關(guān)鍵就是它提供了對(duì)網(wǎng)絡(luò)事件基于消息的異步存取,用于注冊(cè)應(yīng)用程序感興趣的網(wǎng)絡(luò)事件。它請(qǐng)求Windows Sockets DLL在檢測(cè)到套接字上發(fā)生的網(wǎng)絡(luò)事件時(shí),向窗口發(fā)送一個(gè)消息。對(duì)UDP協(xié)議,這些網(wǎng)絡(luò)事件主要為:

  FD_READ 期望在套接字收到數(shù)據(jù)(即讀準(zhǔn)備好)時(shí)接收通知;

  FD_WRITE 期望在套接字可發(fā)送數(shù)(即寫準(zhǔn)備好)時(shí)接收通知;

  FD_CLOSE 期望在套接字關(guān)閉時(shí)接電通知

  消息變量wParam指示發(fā)生網(wǎng)絡(luò)事件的套接字,變量1Param的低字節(jié)描述發(fā)生的網(wǎng)絡(luò)事件,高字包含錯(cuò)誤碼。如在窗口函數(shù)的消息循環(huán)中均加一個(gè)分支:

int ok=sizeof(SOCKADDR);
case wMsg;
switch(1Param)
{
case FD_READ:
//套接字上讀數(shù)據(jù)
if(recvfrom(sr.lpPlayData[j],dwDataSize,0,(struct sockaddr FAR*)&there1,

(int FAR*)&ok)==SOCKET_ERROR0
{
MessageBox)hwnd,“數(shù)據(jù)接收失敗!”,“”,MB_OK);
return(FALSE);
}
case FD_WRITE:
//套接字上寫數(shù)據(jù)
}
break;

  在程序的編制中,應(yīng)根據(jù)需要靈活地將WSAAsyncSelect()函靈敏放在相應(yīng)的消息循環(huán)之中,其它說(shuō)明可參見(jiàn)文獻(xiàn)[1]。此外,應(yīng)該指出的是,以上程序片斷中的消息框主要是為程序調(diào)試方便而設(shè)置的,而在正式產(chǎn)品中不再出現(xiàn)。同時(shí),按照程序容錯(cuò)誤設(shè)計(jì),應(yīng)建立一個(gè)專門的容錯(cuò)處理函數(shù)。程序中可能出現(xiàn)的各種錯(cuò)誤都將由該函數(shù)進(jìn)行處理,依據(jù)錯(cuò)誤的危害程度不同,建立幾種不同的處理措施。這樣,才能保證雙方通話的順利和可靠。

  四、結(jié)論

  本文是多媒體網(wǎng)絡(luò)傳輸項(xiàng)目的重要內(nèi)容之一,目前,結(jié)合硬件全雙工語(yǔ)音卡等設(shè)備,已經(jīng)成功地實(shí)現(xiàn)了話音的全雙工的通信。有關(guān)整個(gè)多媒體傳輸系統(tǒng)設(shè)計(jì)的內(nèi)容,將有另文敘述。

posted on 2007-01-31 11:47 獨(dú)孤九劍 閱讀(896) 評(píng)論(0)  編輯 收藏 引用 所屬分類: network protocol
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            噜噜噜91成人网| 亚洲国产va精品久久久不卡综合| 亚洲欧美综合网| 亚洲国产欧美在线人成| 久久精品视频一| 久久大逼视频| 久久久一区二区| 欧美黄污视频| 91久久精品一区二区三区| 亚洲片在线观看| 一区二区三区欧美在线| 欧美一级午夜免费电影| 久久久青草青青国产亚洲免观| 久久成人av少妇免费| 久久综合综合久久综合| 欧美精品一区二区三区蜜臀| 欧美色图五月天| 国产精品永久入口久久久| 激情综合网址| 麻豆精品视频在线观看| 欧美精品v日韩精品v国产精品| 久久综合色综合88| 欧美日韩爆操| 国产一区二区三区四区在线观看 | 午夜精品理论片| 久久久成人网| 欧美理论片在线观看| 国产九九精品视频| 亚洲日本成人| 欧美影院在线| 亚洲精品1区| 欧美在线视频导航| 国产精品黄色在线观看| 亚洲国产乱码最新视频| 亚洲免费在线播放| 亚洲国产成人在线| 久久久亚洲国产美女国产盗摄| 欧美三级午夜理伦三级中视频| 国内久久婷婷综合| 亚洲综合清纯丝袜自拍| 欧美激情一区二区三区蜜桃视频| 亚洲午夜久久久久久久久电影网| 另类av一区二区| 国产视频久久网| 一区二区三区四区国产精品| 老巨人导航500精品| 亚洲伊人观看| 欧美精品二区| 亚洲人www| 欧美成人免费一级人片100| 亚洲女女女同性video| 国产精品av免费在线观看| 亚洲人成网站777色婷婷| 蜜臀a∨国产成人精品| 久久精品国产久精国产一老狼 | 亚洲国产欧美一区| 久久久久久久性| 国色天香一区二区| 久久久久久久欧美精品| 午夜精彩视频在线观看不卡| 欧美日韩精品欧美日韩精品| 亚洲精品国产精品国自产观看| 久久噜噜亚洲综合| 久久精品一级爱片| 伊人色综合久久天天| 老司机一区二区| 久久琪琪电影院| 亚洲大胆视频| 亚洲国产高清在线| 欧美久久久久久久久| 亚洲私人影院在线观看| 亚洲深夜福利视频| 亚洲欧美日韩国产| 国产日产欧美a一级在线| 欧美制服第一页| 久久精品一区二区三区不卡牛牛 | 亚洲一区在线看| 国产精自产拍久久久久久蜜| 久久国内精品视频| 久久亚洲国产精品日日av夜夜| 亚洲成人在线| 91久久久久久国产精品| 国产精品国产精品国产专区不蜜| 亚洲欧美日韩一区二区三区在线| 亚洲午夜激情网站| 很黄很黄激情成人| 亚洲国产小视频在线观看| 欧美精品一区二区三区四区| 亚洲欧美中文日韩在线| 久久精品首页| 中文欧美字幕免费| 午夜精品久久久久久久99热浪潮| 国产在线一区二区三区四区| 欧美国产综合视频| 国产精品久久久久久久久免费樱桃 | 亚洲第一视频| 日韩一级精品| 国产一区二区三区视频在线观看| 老鸭窝91久久精品色噜噜导演| 欧美高清视频一区| 欧美一区二区三区视频免费播放| 久久久久久伊人| 一本大道久久a久久综合婷婷 | 国产亚洲精品久久久久动| 免费日韩一区二区| 国产精品久久久久久久久久免费看| 久久视频在线免费观看| 欧美日韩精品免费看| 另类天堂av| 国产精品美女www爽爽爽| 欧美福利精品| 国产亚洲欧美另类中文 | 久久精品国产69国产精品亚洲| 亚洲人成网站在线观看播放| 午夜老司机精品| 日韩视频二区| 久久精品一区二区三区四区| 亚洲欧美国产日韩中文字幕| 欧美成人一区二区在线| 久久综合国产精品| 国产精品日韩欧美一区二区三区| 亚洲电影成人| 在线观看视频亚洲| 午夜一区二区三视频在线观看| 亚洲精品乱码久久久久久蜜桃91| 欧美一级视频免费在线观看| 欧美成人国产| 国产精品a久久久久| 欧美aⅴ99久久黑人专区| 国产精品视频成人| 日韩午夜激情av| 亚洲日本在线视频观看| 久久九九99| 久久久亚洲影院你懂的| 国产日韩精品在线观看| 亚洲一区二区在线观看视频| 夜夜精品视频| 欧美三区视频| 国产精品99久久久久久白浆小说| 日韩视频免费看| 欧美成人中文字幕| 亚洲黄色免费| 日韩一级精品视频在线观看| 欧美jjzz| 最近看过的日韩成人| 亚洲免费福利视频| 欧美日韩三级一区二区| 亚洲最新中文字幕| 亚洲欧美成人一区二区在线电影| 欧美视频四区| 国产专区欧美精品| 久久久精品国产免费观看同学| 久久青青草综合| 亚洲国产日韩欧美在线99| 欧美成人午夜77777| 日韩亚洲国产欧美| 亚洲欧美日韩第一区| 国产女人aaa级久久久级| 欧美一区网站| 欧美激情乱人伦| 亚洲亚洲精品在线观看 | 亚洲欧美日韩在线| 国产欧美 在线欧美| 久久久久国产一区二区三区| 欧美国产日产韩国视频| 亚洲狼人综合| 国产精品久久久久久模特| 欧美一进一出视频| 亚洲国产导航| 欧美一区二区三区免费视| 亚洲电影免费观看高清完整版在线观看 | 亚洲高清久久| 亚洲自拍电影| 亚洲第一色在线| 国产精品看片你懂得| 久久久久久噜噜噜久久久精品| 亚洲黄色视屏| 久久激情婷婷| 日韩视频免费大全中文字幕| 国产精品一区久久| 欧美激情亚洲另类| 久久大逼视频| av成人天堂| 欧美激情久久久久| 久久疯狂做爰流白浆xx| 亚洲免费av观看| 国产主播一区二区三区四区| 欧美区一区二| 久久精品五月婷婷| 亚洲一区不卡| 99精品国产热久久91蜜凸| 亚洲精品欧美| 久久视频在线看| 亚洲国产美女精品久久久久∴| 免费人成网站在线观看欧美高清| 猛干欧美女孩| 亚洲国产另类久久精品| 久久午夜av| 欧美大片在线观看一区| 亚洲欧美日韩一区在线|