我正在尝试在C#Xamarin Android应用和Raspberry pi上的C ++应用之间建立TCP连接。
在C#客户端,我正在使用System.Net.Sockets中的TcpClient客户端:
// C#
static public bool Connect(string IP, string port)
{
bool _connected = false;
try
{
client = new TcpClient();
IPAddress _ip = IPAddress.Parse(IP);
int _port = int.Parse(port);
client.Connect(_ip, _port);
_connected = true;
}
catch
{
_connected = false;
}
return _connected;
}
正如您所见,这是TcpClient类的非常直接的使用。
在服务器端,使用SDL_Net(1.2),这是我的套接字init:
// C++
string mNet::Resolve()
{
socketSet = SDLNet_AllocSocketSet(2);
if(socketSet == NULL)
return "Could not allocate socket set : " + string(SDLNet_GetError());
if(SDLNet_ResolveHost(&serverIP, NULL, Prefs::NET_PORT) == -1)
return "Could not resolve server host : " + string(SDLNet_GetError());
serverSocket = SDLNet_TCP_Open(&serverIP);
if(!serverSocket)
return "Could not create server socket : " + string(SDLNet_GetError());
SDLNet_TCP_AddSocket(socketSet, serverSocket);
return "OK";
}
这是一个用于测试的虚拟监听器:
// C++
void mNet::Update()
{
int serverSocketActivity = SDLNet_SocketReady(serverSocket);
if (serverSocketActivity != 0)
{
if(!ClientConnected) // new connection
{
clientSocket = SDLNet_TCP_Accept(serverSocket);
SDLNet_TCP_AddSocket(socketSet, clientSocket);
ClientConnected = true;
SendToClient("1");
Logger::Log("Client connected !");
}
else // server busy
{
SendToClient("0", true);
Logger::Log("Client refused !");
}
}
}
初始化时没有错误,当我运行 netstat -an |时覆盆子上的grep tcp 命令,我可以看到我正在使用的端口(1234)已打开。
但是当我尝试从android模拟器连接时,似乎没有任何事情发生在服务器端(没有套接字活动)。 IP&端口匹配。
我不习惯网络,所以我在这里做错了吗?
其他信息:
定位Android 6
RaspberryPi正在运行UbunutuMate
网络C#课程:https://github.com/arqtiq/RemotePlayerPi/blob/master/App/Network.cs
网络C ++课程:https://github.com/arqtiq/RemotePlayerPi/blob/master/Server/src/mNet.cpp
谢谢!