Extrait IP de connexion écouter et accepter dans le support de la programmation sous Linux en c
Dans le code suivant, je voudrais extraire l'adresse IP du client connecté après avoir accepté une connexion entrante. Que dois-je faire après la accept()
pour l'atteindre?
int sockfd, newsockfd, portno, clilen;
portno = 8090;
clilen = 0;
pthread_t serverIn;
struct sockaddr_in serv_addr, cli_addr;
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0)
{
perror("ERROR opening socket");
}
bzero((char *) & serv_addr, sizeof (serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(portno);
serv_addr.sin_addr.s_addr = INADDR_ANY;
if (bind(sockfd, (struct sockaddr *) & serv_addr, sizeof (serv_addr)) < 0)
{
perror("ERROR on binding");
}
listen(sockfd, 5);
clilen = sizeof (cli_addr);
newsockfd = accept(sockfd, (struct sockaddr *) & cli_addr, &clilen);
Vous l'avez déjà dans cli_addr, n'est-ce pas?
J'ai besoin d'IP pour le client de se connecter à moi
oui, c'est ce que
J'ai besoin d'IP pour le client de se connecter à moi
oui, c'est ce que
accept()
est de donner de nouveau à vous dans cli_addr
! Vous avez seulement besoin de le formater - regarder les réponses ci-dessous.OriginalL'auteur Sajad Bahmani | 2010-01-20
Vous devez vous connecter pour publier un commentaire.
getpeername()
Voir la description utile de la façon de l'utiliser plus à l'indispensable Beej Guide de Programmation du Réseau de.
getpeername()
commeaccept()
remplit l'adresse du client dans son deuxième argument.Beej est vraiment une belle intro.
(S'excuser à propos de tort à droit de vote commentaire ci-dessus que le bruit.)
OriginalL'auteur Tyler McHenry
Votre
cli_addr
contient déjà l'adresse IP et le port du client connecté aprèsaccept()
retourne avec succès, dans le même format que votreserv_addr
variable. Utilisationinet_ntop
pour convertir IP à une chaîne.Hmm, vous êtes confus, quelque part. accept() retourne l'adresse IP du client et le port du client dans son deuxième argument. Vous n'avez pas besoin pour appeler getpeername(), étant donné que vous donne même des informations exactes.
Upvoted. Je pense que la confusion vient du fait que la structure sockaddr contient l'IP 4 octets, alors que l'OP a besoin d'elle dans le texte.
Complètement d'accord - il n'y a pas besoin d'utiliser
getpeername()
dans ce cas, après laaccept()
,cli_addr.sin_addr
etcli_addr.sin_port
contenir la connexion réseau de l'adresse et du port, dans le même format quegetpeername()
retourne.OriginalL'auteur Nikolai Fetissov
Je pense que
getpeername()
n'est pas nécessaire - l'adresse du client est déjà rempli encli_addr
par leaccept()
appel.Vous avez seulement besoin d'utiliser
inet_ntop()
,getnameinfo()
, ougethostbyaddr()
à imprimer ou obtenir plus d'informations.OriginalL'auteur Bandi-T
Vous pouvez suivre cet exemple :
OriginalL'auteur Sajad Bahmani
L'API est décrite dans les pages de manuel. Vous pouvez les parcourir à partir de la console, à commencer par
man socket
et suivez les références àman getpeername
ou de l'utilisation de Konqueror, ce qui la rend très bien avec les liens, si vous demandez#socket
adresse. Dans mon cas, sur Kubuntu, il a été nécessaire d'installermanpages-dev
paquet.OriginalL'auteur dhill