亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? dosnetworkprogrammimg.txt

?? DOS下網(wǎng)絡(luò)編程介紹 Network program in dos env.
?? TXT
?? 第 1 頁 / 共 2 頁
字號:
    int s,            //套接字的句柄;
    int level,        //屬性的分類;
    int optname,      //要設(shè)置的屬性;
    char far *optval, //要設(shè)置的屬性值;
    int optlen        //屬性值參數(shù)的長度。
);

比如,允許套接字綁定到已經(jīng)使用的端口:
DWORD value = 1;
int result = setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (char far *)(&value), sizeof(value));

更詳細(xì)的內(nèi)容請參考本目錄MSTCPSDK.rar中的winsock.txt。或者查看MSDN,內(nèi)容大致相同。
9 錯誤代碼errno
errno是Borland C++編譯器定義的一個整數(shù)型全局變量,很多函數(shù)把執(zhí)行時發(fā)生的錯誤寫到errno變量中,也會把執(zhí)行中執(zhí)行后的狀態(tài)寫到errno變量中,經(jīng)常遇到的有以下這些:

#define EISCONN      118   //socket已經(jīng)連接上
#define ENOTCONN     119   //socket沒有連接上
#define EINPROGRESS  126   //函數(shù)正在執(zhí)行中

第五章 TCP編程模型
和UDP協(xié)議有所區(qū)別,TCP協(xié)議的特點在于:

TCP采用超時重傳及機制來保證不丟失數(shù)據(jù),當(dāng)一個TCP發(fā)送一個數(shù)據(jù)包后,它啟動一個定時器,等待對端確認(rèn)收到這個包,如果在指定的時間內(nèi)沒有得到確認(rèn),將重發(fā)這個包。而接收數(shù)據(jù)包的時候,它將發(fā)送一個確認(rèn),如果檢測到數(shù)據(jù)包有錯,TCP協(xié)議丟棄這個數(shù)據(jù)包,并且不發(fā)送確認(rèn),那么對端會因為超時而重新發(fā)送這個數(shù)據(jù)包。

一組有序的數(shù)據(jù)包,到達(dá)對端時可能會有后發(fā)的數(shù)據(jù)先到的情況,TCP協(xié)議在包首部保存數(shù)據(jù)包序號,如果有必要,它將對收到的數(shù)據(jù)重新排序,并以正確的順序交給應(yīng)用層。

1 客戶端和服務(wù)器端的工作模型


TCP的工作方式用上圖的客戶端/服務(wù)器端模型來描述,通信的發(fā)起方稱為客戶端(Client),通信的等待方稱為服務(wù)器端(Server)。客戶端可以隨時使用connect函數(shù)連接到服務(wù)器端,服務(wù)器檢測到這個連接后,需要使用accept函數(shù)接受這個連接,當(dāng)物務(wù)器接受連接后,一個穩(wěn)定的連接就建立了,雙方可以開始互相通過send和recv函數(shù)收發(fā)數(shù)據(jù)了,這時通信的兩端并沒有任何區(qū)別。

DOS系統(tǒng)通常用作客戶端,服務(wù)端通常用Window系統(tǒng),所以本文主要寫DOS操作系統(tǒng)下的TCP客戶端編程。

2 連接到服務(wù)端
使用connect函數(shù):
int connect(int s, struct sockaddr far *name, int namelen);  s是套接字的句柄;name是服務(wù)端的地址;namelen是name數(shù)據(jù)結(jié)構(gòu)的長度;函數(shù)執(zhí)行成功返回0,不成功返回SOCKET_ERROR(-1),然后使用errno變量得到具體的出錯原因。

struct sockaddr和struct sockaddr_in的內(nèi)容一樣,長度一樣,所以使用struct sockaddr_in定義變量name,在調(diào)用connect函數(shù)的時候強制轉(zhuǎn)換成struct sockaddr。

當(dāng)套接字工作在非阻塞模式下的時候,不管連接成功與否,connect函數(shù)會馬上返回并返回SOCKET_ERROR(-1),這時并不意味著連接失敗,而是表示函數(shù)返回的時候連接尚未成功。這時查詢errno變量如果不等于EINPROGRESS(126,表示操作正在進行中),才表示連接失敗。

非阻塞模式下的連接:
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(6000);
addr.sin_addr.s_addr = inet_addr(“10.0.0.1”);
connect(s, (struct sockaddr far *)(&addr), sizeof(addr));
delay(100);
if(errno != 118)
    printf(“fail to connect”);

3 發(fā)送數(shù)據(jù)
使用send函數(shù):
int send(int s, char far *pBuf, int len, int flags); s是套接字句柄;pBuf是數(shù)據(jù)緩沖區(qū);len是要發(fā)送的數(shù)據(jù)長度;flags是發(fā)送選項,這個參數(shù)一般指定為0。如果發(fā)送失敗,函數(shù)返回SOCKET_ERROR(-1),否則返回成功發(fā)送的字節(jié)數(shù)。

dos_sock為每個socket分配一個發(fā)送緩沖區(qū)和接受緩沖區(qū),用send函數(shù)發(fā)送數(shù)據(jù)時,數(shù)據(jù)并沒有馬上在網(wǎng)絡(luò)上進行傳遞,而是先放到socket的發(fā)送緩沖區(qū)中,數(shù)據(jù)會在合時的時候被發(fā)送出去。所以前面的“成功發(fā)送”指的是成功放入發(fā)送緩沖區(qū)而已。

函數(shù)在阻塞模式和非阻塞模式下的表現(xiàn)有些不同,下面已send函數(shù)發(fā)送n字節(jié)數(shù)據(jù)為例說明。

在阻塞模式下,如果發(fā)送緩沖區(qū)的空閑空間足夠大,能容納n字節(jié)的數(shù)據(jù),這時函數(shù)會將數(shù)據(jù)全部放入發(fā)送緩沖區(qū),然后馬上返回;如果緩沖區(qū)不夠大,函數(shù)會一邊放入數(shù)據(jù)一邊等待,直到把全部數(shù)據(jù)放入緩沖區(qū)為止。在這兩種情況下,返回值都是實際發(fā)送的字節(jié)數(shù)n。這時程序比較簡單:
int m = send(s, pBuf, n, 0); //m = n

在非阻塞模式下,如果發(fā)送緩沖區(qū)的空閑空間也能容納n字節(jié)的數(shù)據(jù),這時函數(shù)也會將數(shù)據(jù)全部放入發(fā)送緩沖區(qū),然后馬上返回,返回值就是實際發(fā)送的字節(jié)數(shù)n。當(dāng)緩沖區(qū)不夠大,函數(shù)也不會等待,而是把一部分?jǐn)?shù)據(jù)放入緩沖區(qū)后馬上返回,這時返回值是實際發(fā)送的字節(jié)數(shù)m。程序可以這樣寫。
while(n > 0)
{
  m = send(s, pBuf, n, 0);
  if(m == SOCKET_ERROR)
  {
  	 printf(“send error”);
      break;
  }
  pBuf += m; //移動指針,指向剩余的數(shù)據(jù)
  n -= m;   //剩余的長度
  delay(10);
}

4 接收數(shù)據(jù)
使用recv函數(shù):
int recv(int s, char far *pBuf, int len, int flags); s是套接字句柄;pBuf是用來返回數(shù)據(jù)的緩沖區(qū);len是要接受的數(shù)據(jù)長度;flags是接收選項,一般也指定為0。如果接收失敗,返回SOCKET_ERROR(-1),否則返回實際接收的字節(jié)數(shù)。

在阻塞模式下,函數(shù)等待直到有數(shù)據(jù)到達(dá)為止(接收緩沖區(qū)不為空),有多少數(shù)據(jù)到達(dá)就返回多少數(shù)據(jù)。要接收n字節(jié)長度的數(shù)據(jù),程序如下:
while(n > 0)
{
  m = recv(s, pBuf, n, 0);
  if(m == SOCKET_ERROR)
  {
  	 printf(“recv error”);
      break;
  }
  pBuf += m; //移動指針,指向剩余的數(shù)據(jù)
  n -= m;   //剩余的長度
}

在非阻塞模式下,如果接收緩沖區(qū)中已經(jīng)有數(shù)據(jù),recv的表現(xiàn)方式和阻塞模式相同,函數(shù)會馬上返回,并視緩沖區(qū)中的數(shù)據(jù)數(shù)量返回1到n之間的數(shù)據(jù)。如果接收緩沖區(qū)空,函數(shù)不會等待,而是馬上返回SOCKET_ERROR(-1)。

5 TCP服務(wù)端的介紹
TCP服務(wù)端一般應(yīng)用在Windows系統(tǒng)下,所以下面描述的函數(shù)都來自MSDN,并且可以在VC++6.0中使用。

服務(wù)端在創(chuàng)建了socket后需要綁定到本地的一個端口上,等待客戶端連接到這個端口。使用bind函數(shù):
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(6000); //本機上的一個端口
addr.sin_addr.s_addr = INADDR_ANY; //表示本機
bind(s, (struct sockaddr far *)(&addr), sizeof(addr));

在綁定之后使用listen函數(shù)使TCP套接字進入監(jiān)聽狀態(tài):
listen(s, 5); 能夠可以同時發(fā)現(xiàn)5個客戶端連接而不遺漏。然后套接字就處于等待連接進入的狀態(tài)了。

當(dāng)有客戶端向監(jiān)聽中的套接字發(fā)起連接后,必須對監(jiān)聽中的套接字調(diào)用accept函數(shù),連接才最后被確認(rèn)。accept函數(shù)將新建一個套接字并返回它的句柄,這個新套接字還是和客戶端連接的,程序以后可以使用它來和客戶端之間收發(fā)數(shù)據(jù)了。
while(1)
{
  SOCKET newSocket = accept(s, 0, 0);
  if(newSocket != INVALID_SOCKET)
  {
      //創(chuàng)建一個新線程
      AfxBeginThread(newThread, LPVOID(newSocket)); 
  }
}
DWORD WINAPI newThread(LPVOID lParam)
{
	SOCKET hSocket = (SOCKET)lParam; 
  // recv(hSocket, pBuf, len, 0);
  // send(hSocket, pBuf, len, 0);
}


總結(jié)
文章詳細(xì)介紹了在MS-DOS操作系統(tǒng)下開發(fā)網(wǎng)絡(luò)客戶端程序,也介紹了Windows中的服務(wù)端。具體代碼請參考董瑣英編寫的過電壓下位機程序。有了上面這些知識,然后仿照過電壓程序?qū)苋菀组_發(fā)出自己的網(wǎng)絡(luò)應(yīng)用。




----------------------------------
楊志朋 2008年4月7日
yzp3646@163.com
yzp3646@sina.com
河北旭輝電氣股份有限公司




第13頁 / 共15頁

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久蜜臀中文字幕| 麻豆成人免费电影| 免费高清视频精品| 91在线观看一区二区| 日韩三级视频在线观看| 中文字幕亚洲区| 国产在线一区二区| 91麻豆精品国产91久久久更新时间 | 一区二区视频在线| 国产伦精品一区二区三区免费 | 国产综合一区二区| 欧美色综合天天久久综合精品| 亚洲国产精华液网站w| 精品一区二区国语对白| 666欧美在线视频| 亚洲成人www| 欧美中文一区二区三区| 国产精品久久久久久户外露出| 国产一区二区三区香蕉| 日韩精品一区二区三区中文不卡| 午夜欧美在线一二页| 色综合久久综合网欧美综合网 | 成人免费高清视频| 久久久久久久电影| 国产精品伊人色| 久久久一区二区三区捆绑**| 经典一区二区三区| 久久亚洲精品小早川怜子| 国产一区二区调教| 久久久亚洲精华液精华液精华液 | 99re这里只有精品视频首页| 国产精品三级av在线播放| 成人小视频免费观看| 国产精品传媒入口麻豆| 99精品黄色片免费大全| 亚洲视频香蕉人妖| 欧美亚洲综合另类| 日韩高清一级片| 精品国产一区二区三区久久久蜜月 | 日韩午夜在线影院| 狠狠v欧美v日韩v亚洲ⅴ| 久久久五月婷婷| 欧美体内she精视频| 亚洲色图在线看| 欧美性生活一区| 日韩精品国产精品| 精品成a人在线观看| 国产成人综合网| 亚洲免费毛片网站| 欧美一区日本一区韩国一区| 老司机免费视频一区二区| 久久久欧美精品sm网站| 北岛玲一区二区三区四区| 亚洲在线成人精品| 欧美一卡二卡三卡| 丁香婷婷深情五月亚洲| 亚洲免费观看高清完整版在线| 欧美中文一区二区三区| 精品亚洲成a人在线观看| 国产精品不卡在线| 在线不卡一区二区| 国产成人av福利| 亚洲午夜激情网站| ww亚洲ww在线观看国产| 色先锋资源久久综合| 日本不卡不码高清免费观看| 国产精品―色哟哟| 日韩中文字幕亚洲一区二区va在线| 亚洲色图在线视频| 欧美日韩国产高清一区二区 | 色综合欧美在线视频区| 天堂成人国产精品一区| 国产欧美一区二区精品忘忧草| 色av一区二区| 国产综合色在线| 亚洲国产一区在线观看| 欧美激情中文不卡| 欧美一级夜夜爽| 91福利社在线观看| 成人毛片在线观看| 极品少妇一区二区三区精品视频| 亚洲一区二区综合| 国产精品久久久久久福利一牛影视 | 久久综合丝袜日本网| 亚洲精品中文字幕乱码三区| 日韩欧美国产系列| 91国产成人在线| 国产成人精品影视| 乱一区二区av| 亚洲国产精品久久久久婷婷884| 久久精品亚洲精品国产欧美| 欧美理论电影在线| 色婷婷av久久久久久久| 成人性生交大片免费| 紧缚奴在线一区二区三区| 午夜精品福利在线| 亚洲精品成人悠悠色影视| 国产精品热久久久久夜色精品三区| 51精品视频一区二区三区| 日本精品裸体写真集在线观看| 国产尤物一区二区在线| 蜜臀精品一区二区三区在线观看| 亚洲图片欧美色图| 亚洲一区在线视频| 一区二区三区精品视频在线| **欧美大码日韩| 国产精品欧美一区二区三区| 久久蜜桃av一区精品变态类天堂 | 丝袜亚洲另类欧美综合| 中文字幕在线不卡一区| 国产精品视频第一区| 国产三级精品三级在线专区| 久久综合色8888| 久久综合久久综合亚洲| 国产视频亚洲色图| 久久久久久久久久久久久女国产乱 | 国产超碰在线一区| 国产99久久精品| 成人爱爱电影网址| 97久久精品人人做人人爽| 91麻豆免费观看| 在线看国产一区| 在线播放国产精品二区一二区四区| 欧洲精品中文字幕| 777色狠狠一区二区三区| 日韩精品影音先锋| 亚洲欧美偷拍卡通变态| 色素色在线综合| 91精品福利视频| 欧美日韩亚洲综合在线| 欧美日韩成人一区| 欧美电影免费观看高清完整版在线 | 国产亚洲成aⅴ人片在线观看| 日本一区二区免费在线观看视频| 日本一区二区三区四区在线视频| 中文字幕在线免费不卡| 亚洲一区视频在线观看视频| 免费av成人在线| 国产91精品精华液一区二区三区| 91小视频在线免费看| 欧美区视频在线观看| 精品国产乱码久久久久久免费| 久久午夜羞羞影院免费观看| 亚洲日穴在线视频| 日韩一区二区三区电影 | 亚洲乱码一区二区三区在线观看| 亚洲在线视频网站| 日韩激情中文字幕| 丁香五精品蜜臀久久久久99网站 | 国产剧情一区二区| 在线观看91视频| 久久精品夜色噜噜亚洲aⅴ| 亚洲蜜臀av乱码久久精品 | 夜色激情一区二区| 国产又黄又大久久| 欧美少妇bbb| 久久久精品免费网站| 亚洲国产精品久久艾草纯爱| 国产乱码一区二区三区| 欧美中文字幕一区| 中文无字幕一区二区三区| 五月激情综合网| 91影视在线播放| 精品久久久久av影院| 一区二区三区日本| 成人黄色软件下载| av电影在线观看一区| 欧美日韩极品在线观看一区| 久久精品亚洲精品国产欧美| 婷婷综合另类小说色区| 91丨九色丨尤物| 久久久一区二区三区| 亚洲成在人线免费| 91在线观看污| 国产欧美日韩三区| 国内欧美视频一区二区| 欧美日韩五月天| 亚洲精品videosex极品| 大白屁股一区二区视频| 久久亚洲综合色| 久久99久国产精品黄毛片色诱| 欧美日韩亚州综合| 亚洲一区二区五区| 欧洲在线/亚洲| 亚洲精品乱码久久久久久日本蜜臀| 东方欧美亚洲色图在线| 久久精品人人做人人综合| 激情综合色丁香一区二区| 欧美一区二区三区小说| 日韩激情一区二区| 欧美精品v日韩精品v韩国精品v| 一区二区三区不卡视频| 91美女福利视频| 亚洲人成网站在线| 色久优优欧美色久优优| 91麻豆成人久久精品二区三区| 丝袜美腿亚洲一区二区图片| 色婷婷久久一区二区三区麻豆| 国产精品第一页第二页第三页| 国产剧情一区在线|