TCP網路程式設計 完成埠之應用

2021-04-12 14:24:49 字數 2094 閱讀 4976

一、執行程式

開發環境mdac2.7,vc6 sp5,win2000

如果你的mdac版本是舊請公升級或者重新編譯。伺服器端的資料庫access,用ado來操作的。客戶端用csv格式的檔案系統的。將**sserver和**sclient放在同乙個機器上,因為編譯時我將ip設定成了127.0.0.1,**sserverdb與**sserver放在同乙個目錄。源**是按1位元組對其編譯,靜態連線的,程式並沒有在網路負擔大,socket連線數量大的條件下測試過。

二、資料結構和通訊協議及處理實現

伺服器端是採用完成埠非同步模式,客戶端是同步的socket類實現的。

伺服器端有偵聽執行緒,工作執行緒組成。

typedef struct _sessionpack

sessionpack,*psessionpack;

前三個字段相當於包頭,data是有效資料首位址。根據需要分配。結構體定義

在packet.h檔案中,協議定義在protocol.h檔案中。乙個sessionpack不要超過4k。ciocpframe是完成埠的封裝類,業務邏輯都在ciocpframe::proecssjob中處理,其中幾個資料庫操作的函式在server.h中。per_handle_data,per_io_operation_data這兩個結構詳細請見完成埠。

客戶端傳送大量資料處理,例如,上傳通訊錄

for(int j=0;jdata;

memset(ppack,0,sizeof(sessionpack)+sizeof(link)*maxlink-1);//maxlink是link結構體個數

ppack->datalength=sizeof(link)*maxlink;

ppack->dataitems=maxlink;//告訴伺服器有幾個link要處理

ppack->commandid=command_upload_link;

for(int i=0;ifile://下一條資料

pdata++;

}g_pclient->send(ppack,sizeof(sessionpack)+sizeof(link)*maxlink-1,0);

delete ppack;

}//ifj

else//最後一組可能不到maxlink個link結構體

g_pclient->send(ppack,sizeof(sessionpack)+sizeof(link)*ileft-1,0);

delete ppack;}}

//伺服器接受資料

原理與客戶端大量傳送類似,不過在伺服器傳送大最後乙個包時要將命令字設定成command_download_link_exit通知客戶端資料傳送結束,請不要在接收了。客戶端請求時需將本地資料的最大id存放在有效資料區以告訴伺服器,避免重複查詢。

三、完成埠介紹

每當有乙個連線上來,就將它與完成埠關聯,完成埠實際上就是乙個重疊io的佇列,當佇列中某乙個物件有訊號時,getqueuedcompletionstatus就返回了,並將這個重疊io及與之對應的單據柄資料傳出,在我的程式裡這個單句柄資料就是客戶端套接字,這時你就可以對緩衝區資料操作了。

handle createiocompletionport(

handle filehandle,//用於完成埠的裝置的控制代碼

handle existingcompletionport,//完成埠控制代碼,如果是null則生成乙個新的

ulong_ptr completionkey,//單據柄資料

dword numberofconcurrentthreads//允許最大的工作執行緒的數量

);//這個函式主要的功能就是生成完成埠,或者將某控制代碼與完成埠關聯

這個函式返回有幾種可能,某個重疊io發生了資料傳輸,或者客戶端closesocket,或者其他原因導致完成埠失敗,或者伺服器呼叫postqueuedcompletionstatus主動要求結束。以下是我在程式裡的判斷**。

if(!bsuccess)

}if(bsuccess)

if(perhandledata==null&&dwnumbytes==0)

四、結束語

客戶端exe

服務端exe

服務端資料庫

原碼

網路程式設計 完成埠IOCP

分類 網路程式設計 2009 12 31 11 20 755人閱讀收藏 舉報 裝置 windows作業系統上允許通訊的任何東西,比如檔案 目錄 序列口 並行口 郵件槽 命名管道 無名管道 套接字 控制台 邏輯磁碟 物理磁碟等。絕大多數與裝置打交道的函式都是createfile readfile wr...

用TCP完成埠探測

起因 socket可以通過tcp實現與其他相同區域網的pc或者相同公網的pc通訊,因此可以通過socket來探測,其他pc或者伺服器的埠是否開放 總結 結合前面我的博文,看得見的tcp與udp 量不足60行,但是效果還可以!可以明顯看到135埠顯示已開啟,此處結合我檢視的pc的埠會更加明顯 在另一台...

網路程式設計 走出完成埠的誤區

f 最後給各位推薦幾本個人認為很經典的書籍 1 unix網路程式設計 richard stevens版,最新版可以當參考 2 tcp ip協議卷 1 3 richard stevens等 3 linux核心xx 名稱可能不正確 作者是德國人還是美國人,忘記了,但是詳細分析了linux下tcp ip協...