2013-04-10 19 views
0

我有一個DLL連接到一個軟件,我們稱之爲driver1。 我有一個java程序,它必須連接到driver1並查詢它的狀態。 該DLL爲我提供了連接和查詢狀態的功能。爲什麼在寫入NetworkStream時收到IOException和SocketException?

我寫了一個C++程序,我給了dll作爲參考,我可以使用它的dll。我可以連接到driver1並查詢其狀態。 然後我創建了一個TcpListener,我的Java程序可以作爲客戶端連接。 我只是接受C++中的客戶端,並等待從Java程序接收數據。

我從Java端發送數據(例如,一個代表dll的「連接」方法的命令)。 這個命令很好的從C++端收到,它解析並調用dll的指定函數。但是,當我想寫的dll函數的返回值到NetworkStream發送返回值到Java端我得到一個異常說:

System.IO.IOException:IOException:無法將數據寫入到運輸連接。嘗試對不是套接字的東西進行操作。

C++的端代碼是類似於從MSDN網站上的TcpListener樣本:

#using <System.dll> 

using namespace System; 
using namespace System::IO; 
using namespace System::Net; 
using namespace System::Net::Sockets; 
using namespace System::Text; 
using namespace System::Threading; 
void main() 
{ 
    try 
    { 

     // Set the TcpListener on port 1124. 
     Int32 port = 1124; 
     IPAddress^ localAddr = IPAddress::Parse("127.0.0.1"); 

     // TcpListener* server = new TcpListener(port); 
     TcpListener^ server = gcnew TcpListener(localAddr,port); 

     // Start listening for client requests. 
     server->Start(); 

     // Buffer for reading data 
     array<Byte>^bytes = gcnew array<Byte>(256); 
     String^ data = nullptr; 

     Console::Write("Waiting for a connection... "); 

     // Perform a blocking call to accept requests. 
     TcpClient^ client = server->AcceptTcpClient(); 
     Console::WriteLine("Connected!"); 
     data = nullptr; 

     while(true) 
     { 
      // Get a stream Object* for reading and writing 
      NetworkStream^ stream = client->GetStream(); 
      Int32 i; 

      // Loop to receive all the data sent by the client. 
      while (i = stream->Read(bytes, 0, bytes->Length)) 
      { 

       // Translate data bytes to a ASCII String*. 
       data = Text::Encoding::ASCII->GetString(bytes, 0, i); 
       Console::WriteLine("Received: {0}", data); 

       // Process the data sent by the client. 
       /* 
       * 
       * Here I parse the data, understand what method of the dll to call. 
       * Call it and make a String^ from the return value. 
       * 
       * 
       */ 
       array<Byte>^msg = Text::Encoding::ASCII->GetBytes(returnValue); 

       // Send back a response. 
       stream->Write(msg, 0, msg->Length); 
       Console::WriteLine("Sent: {0}", data); 
      } 
     } 

     // Shutdown and end connection 
     client->Close(); 
    } 
    catch (SocketException^ e) 
    { 
     Console::WriteLine("SocketException: {0}", e); 
    } 

    Console::WriteLine("\nHit enter to continue..."); 
    Console::Read(); 
} 

我上線的例外,我稱之爲:

於流>寫()

有關發生什麼的任何想法?

在此先感謝...

+0

什麼java代碼看起來像它的stream.Write後?它關閉了套接字嗎? – Default 2013-04-10 13:39:20

+0

@Default,不,它不會關閉套接字,我可以接收和從Java端發送/從我連接到DLL之前。 – rendar 2013-04-10 14:25:08

回答

1

我懷疑連接是由於某種原因而終止。我想如果你使用DOS命令NETSTAT -A檢查連接的狀態,你會發現連接處於關閉狀態或掛起狀態。很難說連接的哪一端(客戶端或服務器)造成了問題。

此外,請嘗試調試TCPSocket以在發送數據之前檢查它的狀態。它可能是一個結束提前關閉連接....

+0

Thanks @justderb,我檢查了與'netstat -a'的連接,並看到在C++端接收到來自java的「連接」命令並連接了dll後,127.0.0.1:1124的舊連接已經死機,而新的C++端和DLL 127.0.0.1:7600之間的連接被打開。當我在dll連接後以調試模式檢查客戶端套接字時,我看到「Available」屬性顯示SocketException。在我調用dll的連接函數之前,它的值爲0. – rendar 2013-04-10 14:10:02

+0

,我可以寫入任何流並將其發送給客戶端。 – rendar 2013-04-10 14:22:26

+0

嗯,我不知道你是什麼或者它在做什麼,所以你需要自己弄清楚。但是,我很高興你發現了這個問題! – justderb 2013-04-10 14:43:12

相關問題