2013-04-15 10 views
0

我正在使用Embarcadero RAD studio C++ builder XE創建一個C++應用程序。該應用程序在阻塞模式下使用動態創建的TServerSocket組件。我創建了一個衍生自TServerClientThread的類,它提供了一個自定義的ClientExecute()方法。這個類是通過我已經實現的TServerSocket事件處理程序OnGetThread創建的。我分配了事件處理程序OnAccept,OnClientConnect,OnClientDisconnectOnClientError。在我的線程類中,我使用TWinSocketStream類從套接字連接讀取和寫入。爲什麼OnClientConnect和OnClientError事件不能在阻塞模式下觸發TServerSocket

我使用自定義書寫類(從TComponent派生)創建TServerSocket,我分配的事件處理程序是此類的成員函數。

OnAcceptOnClientDisconnect事件觸發,但無論是OnClientConnectOnClientError事件觸發有史以來。這個組件的正常行爲是什麼?我讀過的關於這個組件的所有信息都表明,所有事件都會在阻塞模式下觸發TServerSocket,我簡直不明白爲什麼這些事件不會觸發。還有什麼我需要做的或這些事件只是不能在阻塞模式下工作?是否有可能使用TServerSocket實例作爲另一個TComponent派生類的成員造成某些問題?

回答

1

OnClientConnect事件由TServerClientWinSocket構造函數觸發。當WinSock接受新的客戶端套接字時,以及在調用OnAcceptOnGetThread事件之前調用OnGetSocket事件後,立即構造一個對象TServerClientWinSocket。所以OnClientConnect不會被調用的唯一可能的方式是如果您實際上沒有分配給它的處理程序。

OnClientError在非阻塞套接字故障期間被調用,並被TCustomWinSocket.SendStream(),TCustomWinSocket.SendBuf()TCustomWinSocket.ReceiveBuf()調用。如果您使用TWinSocketStream代替您的I/O,則不會調用這些方法。相反,它會在故障時引發ESocketError異常。如果您沒有發現這些異常,調用TServerClientThread將自行終止(將異常傳遞給主線程進行處理後)。

+0

感謝您的回答。我有一個OnClientConnect處理程序分配,但我沒有寫一個'OnGetSocket'處理程序,因爲我明白它不是必需的。我有一個'OnGetThread'處理程序,但沒有'OnGetSocket'處理程序可能的原因,我的事件不會觸發? – mathematician1975

+0

'OnGetSocket'是可選的,對OnClientConnect被調用或不調用都沒有影響。如果您有一個分配給'OnClientConnect'的處理程序,那麼它應該被調用,除非2010/XE中的'TServerSocket'有一個不在其他版本中的錯誤。我從來沒有任何問題,正確調用「OnClientConnect」。我建議你在你的Project Options中啓用調試庫,這樣你就可以進入TServerSocket在'ScktComp.pas'的源代碼,並找出爲什麼'TServerClientWinSocket.Create()'在被TServerWinSocket.GetClientSocket()調用時不會調用'OnClientConnect'。 '。 –

+0

我會嘗試你的建議。感謝您的幫助。 – mathematician1975

相關問題