C ++,你可以连接多个IP连接设备吗? [英] C++, can you connect multiple IP connected devices?

查看:111
本文介绍了C ++,你可以连接多个IP连接设备吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如何连接多个设备?

我可以使用SOCKETS(winsock2.h)连接到一个设备并通过TCP与它通信但是当我尝试在第一个设备连接时尝试连接到另一个设备时,我得到了连接并进行了谈话但最终会崩溃。

第一个连接的源代码:



void CIPtestDlg :: OnConnectToSocket()

{

char MyIPaddress [16]; // = {192.168.2.50};

char PortNumb [16],ClientPort [16];

int ClientportNumb;

memset(MyIPaddress,0,16);

memset(PortNumb,0,16);

memset(ClientPort,0 ,16);



m_ctlIPAddress.GetWindowText(MyIPaddress,16);

m_ctlPortNumber.GetWindowTextA(PortNumb,5);

m_ctlClientPort.GetWindowTextA(ClientPort,6);



if(strlen(ClientPort)== 0 || strlen(PortNumb)== 0 || strlen (MyIPaddress)< 6)

{

AfxMessageBox(请填写端口号或客户端端口号或IP地址);

返回; <无线电通信/>
}



ClientportNumb = atoi(ClientPort);

int error = WSAStartup(0x0202,& w); //填写WSA信息

ConnectSocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);

if(ConnectSocket == INVALID_SOCKET)

{

AfxMessageBox(无法连接。\ n,MB_OK,0);

WSACleanup();

返回;

}

clientService.sin_family = AF_INET;

clientService.sin_addr.s_addr = inet_addr(MyIPaddress);

clientService.sin_port = htons(ClientportNumb);

SenderAddrSize = sizeof(clientService);





if(connect(ConnectSocket, (SOCKADDR *)& clientService,sizeof(clientService))== SOCKET_ERROR)

{

AfxMessageBox(无法连接。\ n,MB_OK,0) ;

WSACleanup();

返回;

}

AfxMessageBox(连接到server.\
,MB_OK,0);

m_ctlIsConnected.SetCheck(TRUE);



返回;

}



第二个c除了一些变量之外,onnect就像第一个一样:

void CIPtestDlg :: OnBnClickedConnect2()

{

char MyIPaddress [16] ;

char PortNumb [16],ClientPort [16];

int ClientportNumb;

memset(MyIPaddress,0,16);

memset(PortNumb,0,16);

memset(ClientPort,0,16);



m_ctlIPAddress2。 GetWindowText(MyIPaddress,16);

m_ctlPortNumber2.GetWindowTextA(PortNumb,5);

m_ctlClientPort.GetWindowTextA(ClientPort,6);



if(strlen(ClientPort)== 0 || strlen(PortNumb)== 0 || strlen(MyIPaddress)< 6)

{

AfxMessageBox(请填写端口号和/或IP地址);

返回;

}

ClientportNumb = atoi(ClientPort);

int error = WSAStartup(0x0202,& w2); //填写WSA信息

ConnectSocket2 = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);



if(ConnectSocket2 == INVALID_SOCKET)

{

AfxMessageBox(无法连接。\ n,MB_OK,0);

WSACleanup();

返回;

}

// sockaddr_in结构指定地址系列,

// IP地址和服务器端口连接到。

clientService2.sin_family = AF_INET;

clientService2.sin_addr.s_addr = inet_addr(MyIPaddress);

clientService2.sin_port = htons (ClientportNumb);

SenderAddrSize2 = sizeof(clientService2);





if(connect(ConnectSocket2,( SOCKADDR *)& clientService2,sizeof(clientService2))== SOCKET_ERROR)

{

AfxMessageBox(无法连接。\ n,MB_OK,0);

WSACleanup();

返回;

}

AfxMessageBox (已连接到server.\,MB_OK,0);

m_ctlIsConnected2.SetCheck(TRUE);



return;

}



这只是一个测试程序,但我无法转换或复制到另一个名称的一个变量是socket(AF_INET,SOCK_STREAM) ,IPPROTO_TCP)



任何线索?

感谢您的阅读,

Craig C.



我尝试了什么:



我试图通过投射来复制函数并且改变名称是为了不互相干扰。

How do you connect more than one device?
I can connect to one device using SOCKETS (winsock2.h) and talk to it via TCP but when I try to connect to another device while the first device is connected, I get connected and talks but eventually will crash.
First connected source code:

void CIPtestDlg::OnConnectToSocket()
{
char MyIPaddress[16];// = {"192.168.2.50"};
char PortNumb[16], ClientPort[16];
int ClientportNumb;
memset(MyIPaddress,0,16);
memset(PortNumb,0,16);
memset(ClientPort,0,16);

m_ctlIPAddress.GetWindowText(MyIPaddress,16);
m_ctlPortNumber.GetWindowTextA(PortNumb,5);
m_ctlClientPort.GetWindowTextA(ClientPort,6);

if(strlen(ClientPort)==0 ||strlen(PortNumb)==0 || strlen(MyIPaddress) < 6)
{
AfxMessageBox("Please fill in Port Number or Client Port Number or IP Address");
return;
}

ClientportNumb = atoi(ClientPort);
int error = WSAStartup (0x0202, &w); // Fill in WSA info
ConnectSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (ConnectSocket == INVALID_SOCKET)
{
AfxMessageBox( "Failed to connect.\n",MB_OK,0 );
WSACleanup();
return;
}
clientService.sin_family = AF_INET;
clientService.sin_addr.s_addr = inet_addr( MyIPaddress );
clientService.sin_port = htons( ClientportNumb );
SenderAddrSize = sizeof(clientService);


if( connect( ConnectSocket, (SOCKADDR *)&clientService, sizeof(clientService)) == SOCKET_ERROR)
{
AfxMessageBox( "Failed to connect.\n",MB_OK,0 );
WSACleanup();
return;
}
AfxMessageBox("Connected to server.\n", MB_OK, 0);
m_ctlIsConnected.SetCheck(TRUE);

return;
}

The 2nd connect is just like the first except some variables have been changed:
void CIPtestDlg::OnBnClickedConnect2()
{
char MyIPaddress[16];
char PortNumb[16], ClientPort[16];
int ClientportNumb;
memset(MyIPaddress,0,16);
memset(PortNumb,0,16);
memset(ClientPort,0,16);

m_ctlIPAddress2.GetWindowText(MyIPaddress,16);
m_ctlPortNumber2.GetWindowTextA(PortNumb,5);
m_ctlClientPort.GetWindowTextA(ClientPort,6);

if(strlen(ClientPort)==0 ||strlen(PortNumb)==0 || strlen(MyIPaddress) < 6)
{
AfxMessageBox("Please fill in Port Number and/or IP Address");
return;
}
ClientportNumb = atoi(ClientPort);
int error = WSAStartup (0x0202, &w2); // Fill in WSA info
ConnectSocket2 = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP);

if (ConnectSocket2 == INVALID_SOCKET)
{
AfxMessageBox( "Failed to connect.\n",MB_OK,0 );
WSACleanup();
return;
}
// The sockaddr_in structure specifies the address family,
// IP address, and port of the server to be connected to.
clientService2.sin_family = AF_INET;
clientService2.sin_addr.s_addr = inet_addr( MyIPaddress );
clientService2.sin_port = htons( ClientportNumb );
SenderAddrSize2 = sizeof(clientService2);


if( connect( ConnectSocket2, (SOCKADDR *)&clientService2, sizeof(clientService2)) == SOCKET_ERROR)
{
AfxMessageBox( "Failed to connect.\n",MB_OK,0 );
WSACleanup();
return;
}
AfxMessageBox("Connected to server.\n", MB_OK, 0);
m_ctlIsConnected2.SetCheck(TRUE);

return;
}

This is only a test program but one variable I could not cast or duplicate to a different name was "socket( AF_INET, SOCK_STREAM, IPPROTO_TCP)"

any clues out there?
Thanks for reading,
Craig C.

What I have tried:

I have tried to duplicate functions by casting and changing names as not to interfere with each other.

推荐答案

亲爱的克雷格,



是的,可以只要客户端套接字描述符彼此独立,就连接到多个服务器套接字。

就上面发布的代码而言,似乎没有任何问题会导致应用程序崩溃但请检查您的控制变量和/或其他可能导致内存的变量泄漏导致您的应用程序崩溃。



有关您的应用程序以及崩溃点或事件的更多信息可帮助我更好地了解您的问题,以便最早解决。我希望在这样做的同时你可以自己找到原因。
Dear Craig,

Yes one can connect to multiple Server sockets as long as the client socket descriptors are independent of each other.
As far as your code posted above, there doesn't seem to be any issue that would cause your application to crash, however please check your control variables and or other variables used that may lead to memory leak resulting your app to crash.

More info about your app and the point or event of crash can help me have a better insight of your issue to resolve it at earliest. I hope while doing so you may find the cause all by yourself.


要做的第一件事是使用你的调试器找出它崩溃的地方,以及原因。这应该有助于修复代码。此外,您似乎正在复制连接套接字的所有代码,因此在某处可能存在问题。您应该创建一个包含所有信息的类,并提供管理通信的各种方法。如果您有MFC,那么您应该使用 CSocket类 [ ^ ]首先提供这些功能。
The first thing to do is to use your debugger to find out where it crashes, and why. That should help to fix the code. Also, you seem to be duplicating all the code for connecting a socket, so it is more than possible that there is a problem somewhere in there. You should create a class that holds all the information and provides the various methods for managing the communication. If you have MFC then you should just use the CSocket Class[^] that provides these features in the first place.


这篇关于C ++,你可以连接多个IP连接设备吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆