versuchen broadcast über udp-socket
Hab ich stieß auf ein problem mit meinem Rundfunk-server. im Grunde möchte ich es, zum senden von übertragungen kontinuierlich von dem moment an, dann starte ich es. aus irgendeinem Grund wird es nicht beginnen, bis er eine Verbindung von irgendwo. Ich muss es versaut haben etwas, aber ich kann nicht erkennen, was.
hier ist mein 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;
grundsätzlich, wenn ich entfernen, recvfrom, es wird mir eine senden-Fehler ("No error"), die einfach verwirrt mich. auch, wenn ich es etwas mit einem client, wird die übertragung starten, aber wenn ich eine Verbindung mit einem anderen client, nur der erste client, der den Erhalt der Sendung.
vielen Dank im Voraus.
Ich bezweifle, dass es darauf ankommt, aber ich versuche, die Sendung der aktuellen Zeit.
broadcast = 'a'
? Warum nicht broadcast = 1
?Ha, gute Frage - ich wohl nicht besser wissen. Das war wirklich lange her, und ich weiß es nicht wirklich. Es ist interessant zu sehen, dass die Fragen, die ich fragte zurück, wenn ich nur begann Sie das Studium der sockets.
Haha ich Stimme zu, habe ich wieder ein paar mal und facepalmed.
InformationsquelleAutor icarus | 2013-06-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sieht aus wie Ihre
Sender_addr
nie initialisiert, so wird beim entfernen derrecvfrom
Sie werden immer ein Fehler, und wenn dierecvfrom
ist vorhanden, es wird immer aufgefüllt, mit der Adresse von dem ersten client zu verbinden (aber nie aktualisiert werden).Wenn Sie nicht wissen, die Adressen der clients, die Sie übertragen wollen, müssen Sie setup einige handshake, wo Sie schicken Sie ein ping, Sie erhalten es mit recvfrom, und speichern Sie Ihre Adresse in eine Liste oder so etwas. Dann, wenn Sie die Sendung, die Sie benötigen, um Ihre Nachricht zu senden auf jedem client-Adresse in der Liste.
Sender_addr
mit der broadcast-IP für das Subnetz, das ist das, was der OP tun sollte, in Erster Linie oder sonst aktivieren SO_BROADCAST, ist nutzlos.ich danke Ihnen sehr. gelöst.
InformationsquelleAutor ryanbwork
Sind Sie nicht initialisieren
Sender_Addr
so dass Sie nicht sagensendto()
wo tatsächlich ausgestrahlt.Versuchen Sie dies:
Sender_addr.sin_addr.s_addr = inet_addr("Broadcast IP Here");
ist ein wenig verwirrend für mich. Sie setzen der Absender-Adresse um die broadcast-ip? Was ist mit dieser Adresse? Sagen wir, ich bin auf 10.0.0.x, sollte es sagen 10.0.0.255?Sender_addr
ist die Ziel Adresse, wo Daten übertragen werden. Ich bin einfach mit der gleichen Variablen-Namen, die in die OP ' s original-code.Sender_addr
könnte umbenannt werden, wieSend_addr
oderTarget_addr
oderBroadcast_addr
oder was auch immer, macht mehr Sinn. Die Absenders - Adresse ist die IP des adapter, dass tatsächlich führt die Sendung. Da die Buchse ist lokal gebundenINADDR_ANY
, es ist welche adapter erreichen Sie das Netzwerk, dass die broadcast-IP gehört.10.0.0.255
wäre die broadcast-IP des10.0.0.x
Netzwerk, wenn Ihre Subnetz-Maske255.255.255.0
.Verwenden
GetAdaptersInfo()
oderGetAdaptersAddresses()
zu Holen/berechnen der tatsächlichen broadcast-IP-Adressen Ihrer Netzwerkadapter.Ah, ich sehe. Danke.
InformationsquelleAutor Remy Lebeau