Adresse IP extraction de prises C
-
12-09-2019 - |
Question
Ok, je suis encore nouveau à l'utilisation des sockets C, mais je me demandais s'il y a un moyen d'extraire l'adresse IP en cours d'exécution en ajoutant setsockopt? Si vous regardez mon code ci-dessous, j'ai tout dans mes prises multicast prêt à envoyer, sauf pour définir la mc_addr variable qui est mon adresse IP.
Ai-je fait quelque chose de mal qui est réel perceptible? Si oui, ne hésitez pas à me faire connaître ou offrir vos suggestions. En ce moment, cependant, je suis surtout préoccupé par obtenir la mc_addr variables rempli.
Je ne l'ai jamais programmé en C avant (juste python, C ++, et depuis le début de cet été, Objective-C), donc c'est la raison pour laquelle je ne sais pas tout ce qu'il ya à savoir sur le langage C et je suis demander de l'aide.
fichier.h
#define MYPORT 5673 /* port for our multicast socket */
int sock; /* socket descriptor */
char send_str[MAX_LEN]; /* string to send */
struct sockaddr_in mc_addr; /* socket address structure */
unsigned int send_len; /* length of string to send */
char* mc_addr_str; /* multicast IP address */
unsigned short mc_port; /* multicast port */
unsigned char mc_ttl; /* time to live (hop count) */
file.c
mc_port = MYPORT;
/* create a socket for sending to the multicast address */
if ((sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) {
NSLog(@"ERROR: broadcastMessage - socket() failed");
return 1;
}
/* set the TTL (time to live/hop count) for the send */
if ((setsockopt(sock, IPPROTO_IP, IP_MULTICAST_TTL,
(void*) &mc_ttl, sizeof(mc_ttl))) < 0) {
NSLog(@"ERROR: broadcastMessage - setsockopt() failed");
return 1;
}
// define the IP address we will be using
mc_addr = // ???
/* construct a multicast address structure */
memset(&mc_addr, 0, sizeof(mc_addr));
mc_addr.sin_family = AF_INET;
mc_addr.sin_addr.s_addr = inet_addr(mc_addr_str);
mc_addr.sin_port = htons(mc_port);
/* clear send buffer */
memset(send_str, 0, sizeof(send_str));
while (fgets(send_str, MAX_LEN, stdin)) {
send_len = strlen(send_str);
/* send string to multicast address */
if ((sendto(sock, send_str, send_len, 0,
(struct sockaddr *) &mc_addr, sizeof(mc_addr))) != send_len) {
NSLog(@"ERROR: broadcastMessage - sendto() sent incorrect number of bytes");
return 1;
}
/* clear send buffer */
memset(send_str, 0, sizeof(send_str));
}
close(sock);
return 0;
La solution
semble correct pour moi - où vous avez la « définir l'adresse IP, nous utiliserons », vous devez simplement mettre mc_addr_str (mc_addr lui-même est rempli avec le code que vous avez déjà, sur la base mc_addr_str). Quelque chose comme:
mc_addr_str = "239.20.30.40";
Il est vraiment à vous ce que vous adresse multicast choix - celui que j'ai mis là je juste pris hors de portée « Administrativement scope ». Vos clients et serveurs ont tout simplement se mettre d'accord là-dessus à l'avance (ou négocier d'une autre manière, comme les clients unicast contacter le serveur pour demander à ce que l'adresse de multidiffusion, ils doivent souscrire à est).
Ce site peut aider.
Autres conseils
Voici un exemple client Multicast en C et, un autre ici .
La ligne correspondante du premier exemple est
saddr.sin_addr.s_addr = inet_addr("226.0.0.1"); //your mcast IP address
Je ne sais pas comment vous auriez pu être à la programmation C++
sans comprendre C
.