DELPHI中完成埠 IOCP 的簡單分析 4

2022-09-02 05:18:09 字數 1782 閱讀 7793

在我以前寫的文章中,一直說的是如何接收資料。但是對於如何傳送資料卻一點也沒有提到。因為從**量上來說接收的**要比傳送多很多。今天我就來寫一下如何使用iocp傳送資料。

function tnetcontrol.sendspecifydata(const socket: tsocket; data: array of char;

datalen: integer): boolean;

const

data_bufsize = 1024;  //這裡定義乙個傳送資料的快取長度,只要和接收的一直就可以

varperiodata: lpper_io_operation_data ;

sendbytes, recvbytes: dword;

flags: dword ;

lenstr:string;

sendbuf:array [0..data_bufsize] of char;

begin

try//由於粘包的關係,所以在需要傳送的資料前面加入4位這次傳送資料的長度。(詳見我的前一篇文章)

setarraylength(datalen,lenstr) ;

fillchar(sendbuf,sizeof(sendbuf),#0);

strmove(sendbuf,pointer(lenstr),4);

strmove(sendbuf+4,data,datalen);

periodata.bytesrecv := 0;

periodata.databuf.len := datalen+4;

periodata.databuf.buf:=@sendbuf;

periodata.bytessend := datalen+4;

flags := 0;

//exit;

//表示傳送失敗,以後也不會有處理在工作者執行緒處出現。

if periodata <> nil then

begin

globalfree(dword(periodata));

end;

result:=false;

exit;

end;

end;

result:=true;

except

result:=false;

end;

end;

使用iocp傳送資料的**就這些,但是這裡需要說明一些問題。

1:讀者一定傳送我們在申請了「單io資料結構」以後並沒有對它進行釋放。這是因為我們使用的是非同步函式wsasend來進行傳送資料,只有當我們確定將資料傳送出去以後才可以將我們申請的這個結構釋放。這就引出了第二個問題。

2:如何判斷我們傳送的資料已經傳送。向我以前的文章中所說的「iocp可以接受來自客戶端的資料和自己傳送出去的資料」,而區分這個資料是來自客戶端還是自己傳送出去的區分就是使用periodata.bytesrecv 和periodata.bytessend 如果periodata.bytessend >0則表示這個資料是自己傳送出去的。現在咱們來回顧一下以前的**,找出釋放「單io資料結構」的地方。

在第二篇文章我寫了這樣的**。

//當我們判斷出來接受的資料是我們傳送出去的資料的時候,在這裡我們清空我們申請的記憶體空間

else

begin

globalfree(dword(periodata));

end;

這裡就是我們釋放「單io資料結構」的地方。

到此我已經將整個的iocp從建立、初始化、接收和傳送簡單的描述了一下。如果讀者根據我寫的思路或者**就可以編寫出以後穩定的基於iocp的網路程式。 

DELPHI中完成埠 IOCP 的簡單分析(1)

用delphi開發網路 已經有一段時間了!我發現在網上用vc來實現完成埠 iocp 的 很多,但是使用delphi來實現的就比較少了。對iocp講的清楚的就更少了。在這裡我把自己編寫delphi下的iocp寫出來,希望對剛學完成埠的朋友有個幫助。首先我們來了解一些在使用iocp的時候需要使用的一些結...

DELPHI中完成埠 IOCP 的簡單分析(1)

用delphi開發網路 已經有一段時間了!我發現在網上用vc來實現完成埠 iocp 的 很多,但是使用delphi來實現的就比較少了。對iocp講的清楚的就更少了。在這裡我把自己編寫delphi下的iocp寫出來,希望對剛學完成埠的朋友有個幫助。首先我們來了解一些在使用iocp的時候需要使用的一些結...

DELPHI中完成埠 IOCP 的簡單分析(4)

在我以前寫的文章中,一直說的是如何接收資料。但是對於如何傳送資料卻一點也沒有提到。因為從 量上來說接收的 要比傳送多很多。今天我就來寫一下如何使用iocp傳送資料。function tnetcontrol.sendspecifydata const socket tsocket data array...