全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:5040
推到 Plurk!
推到 Facebook!

ServerSocket 和ClientSocket 的問題..

答題得分者是:cuteysc
Arnor
一般會員


發表:28
回覆:29
積分:16
註冊:2006-10-28

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-08-14 03:21:04 IP:220.135.xxx.xxx 訂閱
我在同一隻程式裡把 ServerSocket 和 ClientSocket 寫在一起做測試..

在連接上後, 按下按鈕進行傳輸, 我會把資料依次寫入結構來傳送,
接收端也用結構來接收buffer.

程式片段如下:

type
TRANSPACK = record
method : integer;
state : integer;
from : array [0..49] of Byte;
towhom : array [0..999] of Byte;
Cmd : array [0..999] of Byte;
curPack : integer;
TotalPack : integer;
curStreamLen : integer;
curStream : array [0..5999] of Byte;
end;


(傳送端)


Event1 := CreateEvent(nil, false, false, nil);
waitforsingleobject(Event1, 10);
CloseHandle(Event1);
application.ProcessMessages;
ClientSocket1.Socket.SendBuf(myPack, sizeof(myPack));



(接收端)

application.ProcessMessages;
Event1 := CreateEvent(nil, false, false, nil);
waitforsingleobject(Event1, 10);
CloseHandle(Event1);
Socket.ReceiveBuf(myPack, sizeof(myPack));

我想問的問題就在上述的紅字部份, 我發現若不加降速的程式碼, 檔案傳輸有時都會到中間就停了...
甚至我把上述的 10 改成 5, 傳輸就會有中斷情況, 而把它加大就比較沒有問題....
但是傳輸速度變的很慢.. 同個程式互傳平均為 190-200KB/秒而已.

所以想請問版上先進, 我這個問題算是程式寫法的問題, 還是delphi 的 serversocket, clientsocket 傳送結構本身的限制呢?

在我參考的範例有用以下直接傳的方式
(傳送端)
ClientSocket1.Socket.SendStream(TFileStream.Create(OpenDialog1.Filename, fmOpenRead or fmShareDenyWrite));

(接收端)
iLen := Socket.ReceiveLength;
GetMem(Bfr, iLen);
try
Socket.ReceiveBuf(Bfr^, iLen);
FStream.Write(Bfr^, iLen);
finally
FreeMem(Bfr);
end;

這方式傳得很快, 沒加降速都能傳得完,
可是這種寫法很單純, 無法讓傳輸的資料有不同的用法, 比如只能中斷連線當傳檔結束, 無法連續傳多個檔案..之類...

用結構傳跟直接傳, 讓我有以下兩點差別, 讓我很納悶..
1. 速度
2. 傳輸完整性

不曉得有人可以給我這方面的建言嗎?

pcboy
版主


發表:177
回覆:1838
積分:1463
註冊:2004-01-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-08-14 09:37:06 IP:61.220.xxx.xxx 訂閱
WaitForSingleObject的目標不是降速, Delphi 2007上說明如下
-----------------------------------------------------------
WaitForSingleObject
Waits until the specified object is in the signaled state or the time-out interval elapses.
To enter an alertable wait state, use the WaitForSingleObjectEx function. To wait for multiple objects, use the WaitForMultipleObjects.
DWORD WINAPI WaitForSingleObject(
  HANDLE hHandle,
  DWORD dwMilliseconds
);
Parameters
hHandle 
[in] A handle to the object. For a list of the object types whose handles can be specified, see the following Remarks section. 
If this handle is closed while the wait is still pending, the function's behavior is undefined.
The handle must have the SYNCHRONIZE access right. For more information, see Standard Access Rights.
dwMilliseconds 
[in] The time-out interval, in milliseconds. The function returns if the interval elapses, even if the object's state is nonsignaled. If dwMilliseconds is zero, the function tests the object's state and returns immediately. If dwMilliseconds is INFINITE, the function's time-out interval never elapses. 
-----------------------------------------------------------
第二個參數是time out時間, 一般是設定比正常可以工作完成的時間要久
如果 time out 時間到了, 就不再繼續等待 (因為有可能發生預期外的事情, 永遠等不到)
如果time out設定比正常工作完成時間要短, 工作會永遠完成不了
-----------------------------------------------------------
不同寫法, 效能和功能本來就有所差異
某些方法可能效能好, 功能和設定選項少; 某些方法可能剛好相反
根據需求選擇合適的方法和寫法
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案!

子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問!
編輯記錄
pcboy 重新編輯於 2007-08-14 09:44:25, 註解 無‧
Arnor
一般會員


發表:28
回覆:29
積分:16
註冊:2006-10-28

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-08-14 13:25:23 IP:220.135.xxx.xxx 訂閱
WaitforSingleObject 不過是我用來達到降低傳送/接收頻率目的的一個方式...
我當然知道它不是降速. 呵

我發問目標只有一件事: 為什麼同樣是傳輸, 我透過結構buffer傳送, 跟別人範例直接以stream 傳送buffer 長度,
會有正確性的差異. 我用結構傳送若不稍稍wait 一下, 就會有錯誤, 變成接收端都不再收到event, 沒有資料進來.
但稍稍慢它一下, 就會正確了. 直接傳送則都不用慢它一下...

程式多wait 一下, 跟程式邏輯應該無影響才對吧...(難道 socket 程式對網路速度快慢會有能否運作的影響? )

不知是否有人遇過這種情況.

編輯記錄
Arnor 重新編輯於 2007-08-14 13:28:20, 註解 無‧
Arnor 重新編輯於 2007-08-14 13:28:42, 註解 無‧
Arnor 重新編輯於 2007-08-14 13:42:24, 註解 無‧
cuteysc
初階會員


發表:16
回覆:37
積分:35
註冊:2003-05-28

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-08-15 03:50:51 IP:61.217.xxx.xxx 訂閱
這樣的傳輸方式是大有問題的

資料不能夠像這樣無止境的不斷塞給某一端

我建議你, 在 Server 端收到 myPack 資料之後, 丟一個指令碼過去給 Client, 請他繼續傳輸

Client 收到指令碼之後才送出第二個 myPack 資料


===================引 用 Arnor 文 章===================
WaitforSingleObject 不過是我用來達到降低傳送/接收頻率目的的一個方式...
我當然知道它不是降速.?呵

我發問目標只有一件事: 為什麼同樣是傳輸, 我透過結構buffer傳送, 跟別人範例直接以stream 傳送buffer 長度,
會有正確性的差異. 我用結構傳送若不稍稍wait 一下, 就會有錯誤, 變成接收端都不再收到event, 沒有資料進來.
但稍稍慢它一下, 就會正確了. 直接傳送則都不用慢它一下...

程式多wait 一下, 跟程式邏輯應該無影響才對吧...(難道 socket 程式對網路速度快慢會有能否運作的影響? )

不知是否有人遇過這種情況.

系統時間:2024-04-20 19:16:19
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!