Détermination de l'adresse IP d'un client connecté sur le serveur
J'ai un serveur en cours d'exécution sur un ordinateur et que vous avez le port qu'il utilise transmis à mon routeur, et un autre ordinateur exécutant le client de la connexion au serveur à l'aide de mon FAI attribué l'adresse IP externe au lieu de l'adresse locale. Tout cela fonctionne très bien et il se connecte mais Quand je vérifie l'adresse de la socket connecté (client), L'adresse IP qu'il montre est complètement différent? il me montre 148.49.68.0
. Je ne trouve pas cela sur ipconfig et ne comprends pas d'où c'est popping up. Ne pas le client de montrer mon adresse externe? (vu que les deux ordinateurs utilisent la même adresse IP Externe).
[MODIFIER] ajouté serveur source
#include <iostream>
#include <windows.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <string.h>
using namespace std;
int PORT;
const int winsock_version = 2;
const int max_con = 10;
string SERVER_ADDRS;
void Bind(SOCKET &serv,struct sockaddr_in &serv_info,int size);
void Listen(SOCKET &serv,int max_con);
void connection_info(struct sockaddr_in &client);
bool communication(SOCKET &client);
SOCKET Accept(SOCKET &serv);
int main(void){
WSADATA wsadata;
if ( WSAStartup(MAKEWORD(winsock_version,0),&wsadata) == 0 ){
cout<<"-[Initialized.]" << endl;
cout<<"-[Server Address (leave blank to scan for all IP's)]: ";
getline(cin,SERVER_ADDRS);
cout<<"-[Port]: ";
cin>>PORT;
struct sockaddr_in serv_info;
serv_info.sin_family = AF_INET;
serv_info.sin_port = htons(PORT);
if( sizeof(SERVER_ADDRS) > 5 ){
cout<<"-[Listening on: " << SERVER_ADDRS << "]" << endl;
serv_info.sin_addr.s_addr = inet_addr(SERVER_ADDRS.c_str());
}else{
cout<<"-[Scanning for All IP's]" << endl;
serv_info.sin_addr.s_addr = INADDR_ANY;
}
SOCKET serv;
serv = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if ( serv != INVALID_SOCKET ){
//------------------------------------------------------------
Bind(serv,serv_info,sizeof(serv_info));
Listen(serv,max_con);
struct sockaddr_in client_info;
int size = sizeof(client_info);
SOCKET client_sock = Accept(serv);
connection_info(client_info);
if (communication(client_sock) == true){
closesocket(serv);
closesocket(client_sock);
}
//------------------------------------------------------------
}
}else{
cout<<"-[Initialization failed, running cleanup.]" << endl;
}
if (WSACleanup() == 0){
cout<<"-[Cleanup Successful.]" << endl;
}
return 0;
}
void Bind(SOCKET &serv,struct sockaddr_in &serv_info,int size){
if ( bind(serv,(sockaddr*)&serv_info,size) != -1 ){
//Binding complete, now clear the port and allow for reuse if needed using setsockopt
char yes = '1';
if ( setsockopt(serv,SOL_SOCKET,SO_REUSEADDR,&yes,sizeof(yes)) != SOCKET_ERROR){
cout<<"-[Binding Successful.]" << endl;
}
}
}
void Listen(SOCKET &serv,int max_con){
if ( listen(serv,max_con) != -1 ){
cout<<"-[Listening for connections.] " << endl;
}
}
SOCKET Accept(SOCKET &serv){
struct sockaddr_in client_info;
int size = sizeof(client_info);
SOCKET recv;
recv = accept(serv,(sockaddr*)&client_info,&size);
if (recv != INVALID_SOCKET ) {
return recv;
}else{
cout<<"-[Invalid Socket.]" << endl;
}
}
void connection_info(struct sockaddr_in &client){
char *connected_ip= inet_ntoa(client.sin_addr);
int port = ntohs(client.sin_port);
cout<<"-[IP:" << connected_ip <<", Connected on PORT:"<< port << "]"<< endl;
}
bool communication(SOCKET &client){
cout<<"[---------------{CHAT}---------------]" << endl;
int bytes_in;
int bytes_out;
char recvd_text[80];
string send_text;
while(true){
cout<<"-[SERVER]: ";
getline(cin,send_text);
if (sizeof(send_text) > 0 ){
bytes_out = send(client,send_text.c_str(),send_text.length()+1,0);
cout<< endl;
if (bytes_out == SOCKET_ERROR){
cout<<"-[SERVER error in sending.]" << endl;
break;
}
}
bytes_in = recv(client,recvd_text,sizeof(recvd_text),0);
if (bytes_in > 0 ){
cout<<"-[CLIENT]: " << recvd_text << endl; //output on screen
}
if (bytes_in == 0){
cout<<"-[CLIENT has disconnected.]" << endl;
break;
}
if (bytes_in == SOCKET_ERROR){
cout<<"-[CLIENT closed unexpectedly.]" << endl;
break;
}
}
return true;
}
OriginalL'auteur silent | 2010-11-26
Vous devez vous connecter pour publier un commentaire.
Essayez ceci:
OriginalL'auteur Remy Lebeau
Le WinSock
getsockname()
etgetpeername()
fonctions de retour au local et à distance IPs de la socket connecté, respectivement. En supposant que vous utilisez déjà, alors s'il vous plaît montrer votre code, que vous êtes susceptibles de ne pas les utiliser correctement.Oui, accept() retourne des informations sur le client connecté. Cependant, il y a quelques bugs dans votre code. Le plus important bug lié à votre question de départ, c'est que votre Accept() de la fonction de récupération de l'info client dans un sockaddr_in variable locale de n'Accepter que les(), mais alors votre connection_info() la fonction est d'afficher les valeurs à partir d'un autre sockaddr_in local à main() à la place et n'a jamais été rempli avec des données, de sorte que vous êtes en affichage aléatoire d'ordures. Votre Accept() la fonction doit retourner le sockaddr_in données récupérées, jetez pas.
OriginalL'auteur Remy Lebeau
Un c/c++ de manière à obtenir des ip externe est d'utiliser un site web en fonction de l'adresse IP de l'API outil de téléchargement de la page web contenant votre adresse IP dans un tableau de char et d'en extraire l'adresse IP de la source HTML. Voici quelques winsock code pour le démontrer. il utilise http://api.ipify.org/ en ligne de l'api web.
public IP
. Plus loin encore, êtes-vous sûr que leipify.org
service sera autour de votre approche du travail?OriginalL'auteur Software_Designer
(Le suivant est spécifique de Windows.)
Que
AF_INET6
type de prise peut être configuré pour accepter à la foisIPv4
etIPv6
connexions sur le même port:Je voudrais mettre en œuvre la récupération de la connexion du client stats en tant que tel, juste après la
accept
fonction:Noter que le numéro de port signalé sera pour la connexion sur le côté client (et non pas le côté serveur où ce code est en cours d'exécution.)
Et, par ailleurs, si vous souhaitez récupérer les mêmes informations, mais sur le serveur-côté de la connexion, utiliser le même code, mais remplacer
getpeername
avecgetsockname
.OriginalL'auteur ahmd0