是這樣,A去呼叫B,然后B會與服務器C建立Socket連接,B給C發送訊息,C反饋訊息給B,B再回傳給A,整個程序都需要同步進行,即等到上一步做完再做下一步。現在B與C建立連接是通過: ClientSocket.Open;來實作的,然后通過ClientSocket.Active是否為True來判斷有沒有連接上,ClientSocket.ClientType := ctBlocking;
問題是經常會出現未連接上的情況,即B給C發訊息時ClientSocket.Active 還是 False;是設定了阻塞型Open方法還是有延時嗎?我需要怎樣去判斷是否已經連接上,然后去發訊息。求指教。
uj5u.com熱心網友回復:
ctBlocking模式下服務端要寫多執行緒代碼的。uj5u.com熱心網友回復:
現在是要等連接上服務器再做后續處理,但是好像是還沒連接上,程式就已經往下走了,怎么能同步做的?
uj5u.com熱心網友回復:
把你的處理流程梳理下,B相對于A來說是服務端是嗎?要開一個服務等A來連接,而B相對C來說你的B又是一個客戶端是嗎?B主動去連接C?你的B這一邊是做透明資料轉發,不處理任何協議上面的東西?也就是A丟過來是什么你就原樣扔給了C?
uj5u.com熱心網友回復:
B不是服務器,是一個中間資料處理的程序,就是把A傳過來的東西做相應的邏輯處理并編成報文發給C,C是服務器。C處理的結果回傳B也會做對應的處理決議再傳給A。
uj5u.com熱心網友回復:
是這樣,A去呼叫B,然后B會與服務器C建立Socket連接,B給C發送訊息,C反饋訊息給B,B再回傳給A,整個程序都需要同步進行,即等到上一步做完再做下一步。現在B與C建立連接是通過: ClientSocket.Open;來實作的,然后通過ClientSocket.Active是否為True來判斷有沒有連接上,ClientSocket.ClientType := ctBlocking;
問題是經常會出現未連接上的情況,即B給C發訊息時ClientSocket.Active 還是 False;是設定了阻塞型Open方法還是有延時嗎?我需要怎樣去判斷是否已經連接上,然后去發訊息。求指教。
把你的處理流程梳理下,B相對于A來說是服務端是嗎?要開一個服務等A來連接,而B相對C來說你的B又是一個客戶端是嗎?B主動去連接C?你的B這一邊是做透明資料轉發,不處理任何協議上面的東西?也就是A丟過來是什么你就原樣扔給了C?
B不是服務器,是一個中間資料處理的程序,就是把A傳過來的東西做相應的邏輯處理并編成報文發給C,C是服務器。C處理的結果回傳B也會做對應的處理決議再傳給A。
明白你說的意思了,你的網路通訊、協議資料處理是在B,A應該是UI方面的處理??你的B要通知A的話以資料回呼的方式(如果B是DLL的話)很容易做到,我需要怎樣去判斷是否已經連接上,然后去發訊息。求指教,你所說的就是一個點對點的網路通訊而已,感覺是你的業務邏輯沒處理好。
uj5u.com熱心網友回復:
明白你說的意思了,你的網路通訊、協議資料處理是在B,A應該是UI方面的處理??你的B要通知A的話以資料回呼的方式(如果B是DLL的話)很容易做到,我需要怎樣去判斷是否已經連接上,然后去發訊息。求指教,你所說的就是一個點對點的網路通訊而已,感覺是你的業務邏輯沒處理好。
首先謝謝你的回答,A呼叫B是用到回呼,主要是B連接C的時候需要連接上才能往下做,但是經常出現還沒連上就做下面的業務了。
uj5u.com熱心網友回復:
procedure TCustomWinSocket.DoSetAsyncStyles;var
Msg: Integer;
Wnd: HWnd;
Blocking: Longint;
begin
Msg := 0;
Wnd := 0;
if FAsyncStyles <> [] then
begin
Msg := CM_SOCKETMESSAGE;
Wnd := Handle;
end;
WSAAsyncSelect(FSocket, Wnd, Msg, Longint(Byte(FAsyncStyles)));
if FASyncStyles = [] then
begin
Blocking := 0;
ioctlsocket(FSocket, FIONBIO, Blocking);
end;
end;
看下這段代碼,是因為TClientSocket使用的是WSAAsyncSelect通訊模型,ctBlocking設定的SOCKET是否是阻塞,但到你的應用這邊是通過向
TCustomWinSocket = class
private
FHandle: HWnd;
這個FHandle視窗發異步訊息來實作的,所以你在連接回傳后要做同步等待TClientSocket的active狀態或者是等待TClientSocket.FClientSocket.Connected狀態,等待程序要你自己實作,等待最好是加超時處理在里面,防止不在線一直停在這里。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/103103.html
標籤:網絡通信/分布式開發
