inlandchris Ответов: 2

C++, можете ли вы подключить несколько IP-подключенных устройств?


Как подключить более одного устройства?
Я могу подключиться к одному устройству с помощью сокетов (winsock2. h) и разговаривать с ним через TCP, но когда я пытаюсь подключиться к другому устройству, пока первое устройство подключено, я подключаюсь и разговариваю, но в конечном итоге терплю крах.
Первый подключенный исходный код:

void CIPtestDlg:: OnConnectToSocket()
{
char MyIPaddress[16];// = {"192.168.2.50"};
char PortNumb[16], ClientPort[16];
инт 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);

если(функция strlen(клиентского порта)==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();
вернуть;
}
клиента.значение переменной sin_family = равен af_inet;
clientService.sin_addr. s_addr = inet_addr( MyIPaddress );
clientService. sin_port = htons( ClientportNumb );
SenderAddrSize = sizeof(clientService);


если( подключение( ConnectSocket, (структуры *)&ампер;клиента, оператор sizeof(клиента)) == с socket_error)
{
AfxMessageBox ("не удалось подключиться.\n", MB_OK, 0 );
WSACleanup();
вернуть;
}
AfxMessageBox ("подключен к серверу.\n", MB_OK, 0);
m_ctlIsConnected.SetCheck (TRUE);

вернуть;
}

2-е соединение точно такое же, как и первое, за исключением того, что некоторые переменные были изменены:
void CIPtestDlg:: OnBnClickedConnect2()
{
char MyIPaddress[16];
char PortNumb[16], ClientPort[16];
инт 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);

если(функция strlen(клиентского порта)==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);


если( подключение( ConnectSocket2, (структуры *)&ампер;clientService2, оператор sizeof(clientService2)) == с socket_error)
{
AfxMessageBox ("не удалось подключиться.\n", MB_OK, 0 );
WSACleanup();
вернуть;
}
AfxMessageBox ("подключен к серверу.\n", MB_OK, 0);
m_ctlIsConnected2.SetCheck(правда);

вернуть;
}

Это всего лишь тестовая программа, но одна переменная, которую я не мог привести или дублировать на другое имя, была " socket( AF_INET, SOCK_STREAM, IPPROTO_TCP)"

есть какие-нибудь зацепки?
Спасибо за чтение,
Крейг К.

Что я уже пробовал:

Я пытался дублировать функции, бросая и меняя имена, чтобы не мешать друг другу.

2 Ответов

Рейтинг:
8

Richard MacCutchan

Первое, что нужно сделать, - это использовать свой отладчик, чтобы выяснить, где он выходит из строя и почему. Это должно помочь исправить код. Кроме того, вы, кажется, дублируете весь код для подключения сокета, так что более чем возможно, что где-то там есть проблема. Вы должны создать класс, который содержит всю информацию и предоставляет различные методы управления коммуникацией. Если у вас есть MFC, то вы должны просто использовать Класс CSocket[^] что обеспечивает эти функции в первую очередь.


inlandchris

Дорогой Ричард М.
Да, CSocket звучит хорошо, и это для MFC, я попробую это в следующий раз. Кроме того, я только что купил 4 книги по ACE, так что буду пробовать это последнее. Тогда я посмотрю, что лучше. Эта тестовая программа - просто тест. У меня есть огромная программа на C++, которую мне нужно обновить с последовательного RS422 до IP, так что эти тесты помогут мне принять решение.
Спасибо

Рейтинг:
20

kunal.tawde

Дорогой Крейг,

Да, можно подключаться к нескольким серверным сокетам, если дескрипторы клиентских сокетов независимы друг от друга.
Что касается вашего кода, опубликованного выше, то, похоже, нет никакой проблемы, которая могла бы привести к сбою вашего приложения, однако, пожалуйста, проверьте ваши управляющие переменные и / или другие используемые переменные, которые могут привести к утечке памяти, приводящей к сбою вашего приложения.

Более подробная информация о вашем приложении и точке или событии сбоя может помочь мне лучше понять вашу проблему, чтобы решить ее как можно скорее. Я надеюсь, что, делая это, вы сможете найти причину самостоятельно.


inlandchris

Уважаемые Кунал.tawde,
Спасибо за просмотр. Таким образом, мне нужно только, чтобы клиентский сокет был другим, а все остальные в порядке, чтобы быть одинаковыми? это очень помогает.
По-видимому, на отправляющей части программы у меня есть блокирующий recv, и это была проблема сбоя; ожидание навсегда.

kunal.tawde

Есть ли что-нибудь, чем я могу вам помочь, чтобы решить вашу проблему? Если да, то я хотел бы получить более подробную информацию с вашей стороны относительно нижеследующего.

По-видимому, на отправляющей части программы у меня есть блокирующий recv, и это была проблема сбоя; ожидание навсегда.

Кроме того, просто предположение, что вы можете использовать "select" на вашем клиентском конце, чтобы сделать его неблокирующим recv. Если вы хотите, я могу вам помочь по этой части.