en essayant de diffuser à travers des sockets udp
J'ai choppé un problème avec mon serveur de diffusion. en fait, je cherche à envoyer des émissions en continu à partir du moment où je le lance. pour une raison quelconque, il ne démarre pas jusqu'à ce qu'il reçoit une connexion à partir de quelque part. Je dois avoir loupé quelque chose, mais je ne peux pas réaliser ce qui.
voici mon code:
WSADATA wsaData;
WSAStartup(MAKEWORD(2, 2), &wsaData);
SOCKET sock;
sock = socket(AF_INET, SOCK_DGRAM, 0);
char broadcast = 'a';
if(setsockopt(sock, SOL_SOCKET, SO_BROADCAST, &broadcast, sizeof(broadcast)) < 0)
{
perror("broadcast options");
closesocket(sock);
return 1;
}
struct sockaddr_in Recv_addr;
struct sockaddr_in Sender_addr;
int len = sizeof(struct sockaddr_in);
char recvBuff[50];
int recvBuffLen = 50;
//char sendMsg[] = "broadcast message from salam rofl";
Recv_addr.sin_family = AF_INET;
Recv_addr.sin_port = htons(PORT);
Recv_addr.sin_addr.s_addr = INADDR_ANY;
if(bind(sock, (sockaddr*)&Recv_addr, sizeof(Recv_addr)) < 0)
{
perror("bind");
_getch;
closesocket(sock);
return 1;
}
//recvfrom(sock, recvBuff, recvBuffLen, 0, (sockaddr *)&Sender_addr, &len);
//cout << "\nreceived message: " << recvBuff;
while(1)
{
Sleep(3000);
//_getch();
getTime();
if(sendto(sock, currentTime, strlen(currentTime)+1, 0, (sockaddr *)&Sender_addr, sizeof(Sender_addr)) < 0)
{
perror("borhot send: ");
_getch();
closesocket(sock);
return 0;
}
else cout << "message sent successfully";
}
_getch;
closesocket(sock);
WSACleanup();
return 0;
en gros si je supprimer recvfrom, il va me donner un envoyer erreur ("Pas d'erreur"), qui se contente de me énigmes. aussi, si je les envoie quelque chose avec un client, il va commencer à diffuser, mais si je me connecte avec un autre client, seul le premier client de la réception de la radiodiffusion.
vous en remercie d'avance.
J'en doute des questions, mais je vais essayer de diffuser l'heure actuelle.
- Juste une question; je réalise que c'est super vieux. Pourquoi
broadcast = 'a'
? Pourquoi ne pasbroadcast = 1
? - Ha, bonne question - je probablement ne savais pas mieux. C'était vraiment il y a longtemps et je ne m'en souviens pas vraiment à tout ça. Il est intéressant de voir les questions que je me posais quand j'ai seulement commencé à étudier les sockets.
- Haha je suis d'accord, j'ai repris un peu de temps et facepalmed.
Vous devez vous connecter pour publier un commentaire.
Ressemble votre
Sender_addr
est de ne jamais être initialisé, donc quand vous supprimez lerecvfrom
vous obtenez une erreur, et lorsque lerecvfrom
est en place, il se rempli avec l'adresse du premier client pour se connecter (mais de ne jamais être mis à jour).Si vous ne connaissez pas les adresses des clients que vous souhaitez diffuser, vous aurez besoin de mettre en place un poignée de main où ils vous envoyer un ping, vous la recevez avec recvfrom, et que vous stockez leur adresse dans une liste ou quelque chose. Ensuite, lors de la diffusion, vous devez envoyer votre message à chaque client adresse dans la liste.
Sender_addr
avec la diffusion IP de sous-réseau, qui est ce que l'OP doit être fait en premier lieu ou autre permettant SO_BROADCAST est inutile.Vous n'êtes pas de l'initialisation
Sender_Addr
vous n'êtes donc pas diresendto()
où effectivement diffusion.Essayez plutôt ceci:
Sender_addr.sin_addr.s_addr = inet_addr("Broadcast IP Here");
est un peu confus pour moi. La configuration de l'adresse des expéditeurs de diffusion ip? Qu'est-ce que cette adresse? Disons que je suis sur 10.0.0.x, devrait-il dire 10.0.0.255?Sender_addr
est le destination adresse de l'endroit où les données doivent être diffusées à l'. Je suis tout simplement en utilisant les mêmes noms de variables qui sont dans le po le code original.Sender_addr
pourrait être renommé commeSend_addr
ouTarget_addr
ouBroadcast_addr
ou tout ce qui fait plus de sens pour vous. Le de l'expéditeur adresse IP de la carte qui effectue la diffusion. Depuis le socket est liée localement à laINADDR_ANY
, c'est n'importe quelle carte peut atteindre le réseau de la diffusion IP appartient.10.0.0.255
serait la diffusion IP de votre10.0.0.x
réseau si son masque de sous-réseau est255.255.255.0
.GetAdaptersInfo()
ouGetAdaptersAddresses()
pour obtenir/obtenir le nombre réel de diffusion adresses ip de vos cartes réseau.