Страницы

Поиск по вопросам

суббота, 13 июля 2019 г.

не работает широковещательный сокет на разных хостах на с++

Делаю широковещательный сокет на с++. на клиенте установила setsockopt и в адресе прописала INADDR_BROADCAST. проблема в том, что когда я включаю клиент и сервер на одном компьютере, то всё работает, а когда сервер и клиент располагаются на разных то до сервера ничего не доходит.Пробовали отключать антивирусники, пробовали отключать брандмауэр, соединяться по витой паре, ничего не помогло. Как можно решить эту проблему? Вот клиент.
// ClientBr.cpp: определяет точку входа для консольного приложения. //
#include "stdafx.h" #include "Winsock2.h" #include #include #include"GetErrorMsgText.h" #pragma comment(lib,"WS2_32.lib") // экспорт WS2_32.dll using namespace std;
bool GetServer(SOCKET cC,char *call, short port, sockaddr* from, unsigned int flen, int *lto, in_addr addr) { try {
int lobuf = 0; char ibuf[100000]; //буфер ввода int lb = 0; port=htons(2000); if ((lobuf = sendto(cC,call,strlen(call)+1,NULL, from, flen)) == SOCKET_ERROR) throw SetErrorMsgText("recv:"); cout<<"Отправлено сообщение "<
cout<<"Получено "< ErrorMsgText(WSAGetLastError()); cout <<"Код ошибки: "<
int _tmain(int argc, _TCHAR* argv[]) { WSADATA wsaData;
system("chcp 1251");
try { if (WSAStartup(MAKEWORD(2,0), &wsaData) != 0) throw SetErrorMsgText("Startup error"); SOCKET cC; if ((cC = socket(AF_INET, SOCK_DGRAM, NULL))== INVALID_SOCKET) throw SetErrorMsgText("socket error"); int optval = 1; if (setsockopt(cC,SOL_SOCKET,SO_BROADCAST, (char*)&optval,sizeof(optval)) == SOCKET_ERROR) throw SetErrorMsgText("opt:");

SOCKADDR_IN serv; // параметры сокета cC serv.sin_family = AF_INET; // используется IP-адресация serv.sin_port = htons(2000); // порт 2000 serv.sin_addr.s_addr = INADDR_BROADCAST ; // любой собственный IP-адрес inet_addr("127.0.0.1")
char obuf[100000]; //буфер вывода int lobuf = 0; //количество отправленных int lb = 0; int lc = sizeof(serv);
cout<<"Введите сообщение серверу"<>obuf;
GetServer(cC,obuf,2000,(sockaddr*)&serv, sizeof(serv), &lc,serv.sin_addr); //cout<<"Ip-адрес сервера: "< int time=clock(); cout<<"Время обмена сообщениями "< if (closesocket(cC)== SOCKET_ERROR) throw SetErrorMsgText("closesocket error");
if (WSACleanup()== SOCKET_ERROR) throw SetErrorMsgText("Cleanup error");
} catch (string errorMsgText) // hm hm hm { cout < ErrorMsgText(WSAGetLastError()); cout <<"Код ошибки: "<Вот сервер:
// ServerT.cpp: определяет точку входа для консольного приложения. //
#include "stdafx.h" #include "Winsock2.h" #include #include #include"GetErrorMsgText.h" #include "windows.h" #pragma warning (disable: 4996) #pragma comment(lib,"WS2_32.lib") // экспорт WS2_32.dll using namespace std;
bool GetRequestFromClient(SOCKET Ss, char name[100000], short port,sockaddr* from, int * flen,in_addr addr) { try{
char message[100000]; if ((recvfrom(Ss,message , sizeof(message), NULL, from, flen)) == SOCKET_ERROR) { throw SetErrorMsgText("recv"); return false; } else { if (*message==*name) {
cout<<"Правильный позывной"< ErrorMsgText(WSAGetLastError()); cout <<"WSAGetLastError: "<bool PutAnswerToClient(SOCKET sS,char* name , unsigned int lto, sockaddr* to) { try{
if ((sendto(sS,name,strlen(name)+1,NULL,to, lto)) == SOCKET_ERROR) throw SetErrorMsgText("send error"); else cout <<"Позывной отправлен клиенту "< ErrorMsgText(WSAGetLastError()); cout <<"WSAGetLastError: "< try { if (WSAStartup(MAKEWORD(2,0), &wsaData) != 0) throw SetErrorMsgText("Startup error");
if((sS = socket(AF_INET, SOCK_DGRAM, NULL))== INVALID_SOCKET) throw SetErrorMsgText("socket error");
SOCKADDR_IN serv; // параметры сокета sS serv.sin_family = AF_INET; // используется IP-адресация serv.sin_port = htons(2000); // порт 2000 serv.sin_addr.s_addr = INADDR_ANY; // любой собственный IP-адрес
if (bind(sS,(LPSOCKADDR)&serv, sizeof(serv))== SOCKET_ERROR) throw SetErrorMsgText("bind error");
SOCKADDR_IN clnt; // параметры сокета клиента memset(&clnt,0,sizeof(clnt)); // обнулить память int lc = sizeof(clnt);
int ls=sizeof(serv);
while (true) { GetRequestFromClient(sS, name,htons(2000),(sockaddr*)&clnt,&lc,clnt.sin_addr); //cout<<"Ip-адрес клиента: "< if (WSACleanup()== SOCKET_ERROR) throw SetErrorMsgText("Cleanup error");
} catch (string errorMsgText) { cout < ErrorMsgText(WSAGetLastError()); cout <<"WSAGetLastError: "<

Ответ

Проблема была лишь в том, что не был отключен VirtualBox Host-Only Network, сетевое подключение Bluetooth и подключение по локальной сети. Когда я это всё отключила широковещательный сокет заработал на разных хостах.

Комментариев нет:

Отправить комментарий