Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Estou criando um programa que deve se comunicar através de broadcast já que não haverá um servidor definido. Tentei criar uma classe para a conexão, mas só consegui resultados com TCP.
Em Python consegui consegui fazer. Aprendi o básico da linguagem e através de alguns tutoriais criei a classe para a conexão, mas por enquanto quero fazer em C++.
Fazendo o mesmo que o script Python meu código em C++ parece enviar e receber algo, mas ele só recebe em uma segunda instância do programa e mesmo assim não exibe nada.
Funciona somente se o endereço de broadcast for de uma interface especifica (192.168.2.255). Não sei porque isso acontece, mas a interface é do VMWare.
Código C++:
#pragma once
#include "stdafx.h"
#include <winsock2.h>
#include <ws2tcpip.h>
#pragma comment (lib, "Ws2_32.lib")
#define DEFAULT_PORT "6881"
#define MAX_PACKET_SIZE 1000000
SOCKET NetworkSocket;
int _tmain(int argc, _TCHAR* argv[])
{
//Criar socket UDP {
WSADATA wsaData;
WSAStartup(MAKEWORD(2,2), &wsaData);
NetworkSocket = INVALID_SOCKET;
NetworkSocket = socket(AF_INET, SOCK_DGRAM, 0);
setsockopt(NetworkSocket, SOL_SOCKET, SO_REUSEADDR, (char*)1, sizeof((char*)1));
setsockopt(NetworkSocket, SOL_SOCKET, SO_BROADCAST, (char*)1, sizeof((char*)1));
struct addrinfo* result = NULL, hints;
ZeroMemory(&hints, sizeof(hints));
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_DGRAM;
hints.ai_protocol = 0;
getaddrinfo("", DEFAULT_PORT, &hints, &result);
bind(NetworkSocket, result->ai_addr, (int)result->ai_addrlen);
// } addrinfo broadcast {
result = NULL;
ZeroMemory(&hints, sizeof(hints));
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_DGRAM;
getaddrinfo("255.255.255.255", DEFAULT_PORT, &hints, &result);
// } Enviar {
char* data = "Ola";
sendto(NetworkSocket, data, sizeof(data), 0, result->ai_addr, (int)result->ai_addrlen);
printf("Send: |%s|\n", data);
// } Receber {
char network_data[MAX_PACKET_SIZE];
recv(NetworkSocket, network_data, MAX_PACKET_SIZE, 0);
printf("Receive: |%s|\n", network_data);
// }
while(true){
}
return 0;
}
Código Python:
import socket
class Network:
DEFAULT_PORT = 6881
_MAX_PACKET_SIZE = 1000000
def __init__(self):
self.NetworkSocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
self.NetworkSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.NetworkSocket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
self.NetworkSocket.bind(('',self.DEFAULT_PORT))
def send(self, data, address = False, ip = False):
if address == False:
if ip == False:
address = ('<broadcast>', self.DEFAULT_PORT)
else:
address = (ip, self.DEFAULT_PORT)
self.NetworkSocket.sendto(data, address)
return True
def recv(self):
return self.NetworkSocket.recvfrom(self._MAX_PACKET_SIZE)
Para realizar alguns testes da classe em Python criei o main para receber alguns argumentos e realizar as operações:
from network import Network
import sys
import getopt
def main(argv):
try:
opts, args = getopt.getopt(argv,"hrs",["help","receive","send","times=","string=","ipaddress="])
except getopt.GetoptError:
print('test.py (-r [--times=<TIMES>] | -s --string=<STRING> [--ipaddress=<IPADDRESS>])')
sys.exit(2)
times = None
str = None
IPaddr = None
if ('-h', '') in opts or ('--help','') in opts:
print('test.py (-r [--times=<TIMES>] | -s --string=<STRING> [--ipaddress=<IPADDRESS>])')
elif ('-r', '') in opts or ('--receive','') in opts:
Net = Network()
for opt, arg in opts:
if opt == '--times':
times = arg
if times != None:
if times == 'ever':
while True:
message, address = Net.recv()
print("Message:", message.decode(), "Address:", address[0])
else:
times = int(times)
while times != 0:
message, address = Net.recv()
print("Message:", message.decode(), "Address:", address[0])
times -= 1
else:
message, address = Net.recv()
print("Message:", message.decode(), "Address:", address[0])
elif ('-s', '') in opts or ('--send','') in opts:
for opt, arg in opts:
if opt == '--string':
str = arg
elif opt == '--ipaddress':
IPaddr = arg
if str != None:
if IPaddr != None:
Net = Network()
Net.send(bytes(str,"UTF-8"),ip=IPaddr)
else:
Net = Network()
Net.send(bytes(str,"UTF-8"))
else:
print('test.py (-r [--times=<TIMES>] | -s --string=<STRING> [--ipaddress=<IPADDRESS>])')
else:
print('test.py (-r [--times=<TIMES>] | -s --string=<STRING> [--ipaddress=<IPADDRESS>])')
sys.exit()
if __name__ == "__main__":
main(sys.argv[1:])
Carregando comentários...