我有一个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();
}
我在我打电话的那一行得到了例外:
于流→写()
有关正在发生的事情的任何想法?
提前致谢...
答案 0 :(得分:1)
我怀疑连接因某种原因终止了。我想如果使用DOS命令NETSTAT -A
检查连接状态,您会发现连接已关闭或处于暂挂状态。很难说连接的哪一端(客户端或服务器)造成了问题。
此外,尝试调试TCPSocket
以在发送数据之前检查其状态。可能是一端过早关闭连接......