为什么在写入NetworkStream时会出现IOException和SocketException?

时间:2013-04-10 13:33:03

标签: .net c++-cli socket.io ioexception system.net.sockets

我有一个dll将我连接到软件,我们称之为driver1。 我有一个java程序,它必须连接到driver1并查询其状态。 dll为我提供了连接和查询状态的功能。

我写了一个c ++程序,我将dll作为参考,我可以使用它的dll。我可以连接到driver1并查询其状态。 然后我创建了一个TcpListener,我的Java程序可以作为客户端连接。 我只是接受c ++中的客户端并等待从Java程序接收数据。

我从Java端发送数据(例如,表示dll的“connect”方法的命令)。 该命令很好地从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();
}

我在我打电话的那一行得到了例外:

  

于流→写()

有关正在发生的事情的任何想法?

提前致谢...

1 个答案:

答案 0 :(得分:1)

我怀疑连接因某种原因终止了。我想如果使用DOS命令NETSTAT -A检查连接状态,您会发现连接已关闭或处于暂挂状态。很难说连接的哪一端(客户端或服务器)造成了问题。

此外,尝试调试TCPSocket以在发送数据之前检查其状态。可能是一端过早关闭连接......