herstellen einer Verbindung zu einer IP-Adresse anstelle von localhost?
dies ist mein zweiter gehen bei dieser, die ich geschrieben habe, einer server-Anwendung wie unten, die Ausgänge, was der client sendet. Ich habe eine server.exe version, wo hört es auf, etwas über INADDR_ANY
, getan zu Haben, ich kann mit meinem client und auf dem server verbinden, wenn ich geben Sie den client mit localhost verbinden (Was alles Prima funktioniert).
aber wenn ich meine eigene IP-Adresse statt "localhost" für den client, ich kann keine Verbindung zu dem server?. Sollte ich nicht in der Lage sein dem server zu verbinden, auf diese Weise?.
Nutzte ich ein weiteres server.exe das war hart codiert, um meine IP-Adresse, ohne INADDR_ANY
aber es war nicht in der Lage zu bind()
oder listen()
auf eingehende verbindungen. Ich bin verwirrt, wie, um fortzufahren.
(Ich bin mit den server und client auf der gleichen Maschine befinden, ist das ein Problem?)
server
#include <iostream>
#include <windows.h>
#include <winsock2.h>
#include <ws2tcpip.h>
using namespace std;
#define PORT 3490
#define IP "118.93.0.164"
#define BACKLOG 10
const int winsockversion = 2;
int main(void){
WSADATA wsadata;
if ( (WSAStartup(MAKEWORD(winsockversion,0),&wsadata)) == 0){
cout<<"-WSAStartup Initialized." << endl;
struct sockaddr_in serv;
memset(&serv,0,sizeof serv);
serv.sin_family = AF_INET;
serv.sin_port = htons(PORT);
serv.sin_addr.s_addr = inet_addr(IP);//INADDR_ANY;//inet_addr(IP);
//---------------------------------------
struct addrinfo serv_addrinfo;
serv_addrinfo.ai_family = AF_INET;
serv_addrinfo.ai_socktype = SOCK_STREAM;
serv_addrinfo.ai_protocol = IPPROTO_TCP;
serv_addrinfo.ai_addrlen = sizeof(serv);
serv_addrinfo.ai_addr = (sockaddr*)&serv;
//---------------------------------------
SOCKET serv_con;
serv_con = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if (serv_con != INVALID_SOCKET){
cout<<"-Server Socket created." << endl;
}
if (bind(serv_con,serv_addrinfo.ai_addr,serv_addrinfo.ai_addrlen) != -1){
cout<<"-Binding Successful." << endl;
}
if( listen(serv_con,BACKLOG) != -1){
cout<<"-Listening for incoming connections." << endl;
}
//--------------------------------------------------------------------
SOCKET recv_socket;
struct sockaddr_in client_info;
int client_info_size = sizeof(client_info);
char *con_addr = inet_ntoa(client_info.sin_addr);
recv_socket = accept(serv_con,(sockaddr*)&client_info,&client_info_size);
if( recv_socket != INVALID_SOCKET ){
cout<<"-Connection Established!. " << endl;
cout<<"-Connected to: [" << con_addr << "] " << endl;
//----------------------------------------------------------------------
char buffer[80];
int bytes_in;
while(true){
bytes_in = recv(recv_socket,buffer,sizeof(buffer),0);
if ( bytes_in > 0 ){
cout<<"[" << con_addr << "]" << buffer << endl;
}
if (bytes_in == 0 ){
cout<<"[" << con_addr << "] has disconnected." << endl;
break;
}
if (bytes_in == -1 ){
cout<<"-Possible Abrupt disconnecton from [" << con_addr << "]" << endl;
break;
}
}
closesocket(recv_socket);
closesocket(serv_con);
}
}else{
cout<<"-WSAStartup Initialization failed." << endl;
}
if( WSACleanup()!= -1){
cout<<"-WSACleanp Successful." << endl;
}
WSAGetLastError();
return 0;
}
client
/*client*/
#define _WIN32_WINNT 0x501
#include <iostream>
#include <windows.h>
#include <winsock2.h>
#include <ws2tcpip.h>
using namespace std;
#define PORT "3490"
#define SERVER "118.93.0.164" //and localhost
const int winsockVersion = 2;
int main(void){
WSADATA wsadata;
if ( (WSAStartup(MAKEWORD(2,0),&wsadata)) == 0){
cout<<"-WSAStartup Initialized." << endl;
struct addrinfo hints, *res;
int sockfd;
memset(&hints,0,sizeof hints);
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
if (getaddrinfo(SERVER,PORT,&hints,&res) != 0){
cout<<"-getaddrinfo unsuccessful." << endl;
}
if ( (sockfd = socket(res->ai_family,res->ai_socktype,res->ai_protocol)) == -1 ){
cout<<"-Unable to create socket." << endl;
}
if ( (connect(sockfd,res->ai_addr,res->ai_addrlen)) != -1 ){
cout<<"-Connection Established." << endl;
}
cout<<"-Client connecting to: " << res->ai_addr << endl;
while(true){
string text_buff;
cout<<"Enter text: ";
getline(cin,text_buff);
if( (send(sockfd,text_buff.c_str(),text_buff.length()+1,0)) != -1 ){
cout<<"-text_buff sent!." << endl;
}
}
}else{
cout<<"-WSAStartup Initialization failed." << endl;
if(WSACleanup()!=0){
cout<<"-WSACleanup Successful." << endl;
}else{
cout<<"-WSACleanup Failed." << endl;
}
}
return 0;
}
- laufen server und client auf der gleichen Maschine ist definitiv NICHT ein Problem. Ich vermute, dass die IP-Adresse, die Sie verwenden, ist nicht wirklich die Adresse Ihrer Maschine besitzt. hat Ihr server hat die öffentliche Adresse? oder die private Adresse? Sind Sie sicher, dass Sie die IP-Adresse gemeldet von ipconfig Befehl?
- Sie sind Recht seinem keine meiner Maschinen eine IP-Adresse ist die IP-Adresse von meinem ISP. Ich habe mehrere Computer über wifi verbunden, ich war versucht, eine Verbindung zu meiner externen IP (wenn das der name für die IP-Adresse gegeben, die von meinem ISP?).
- wie kann ich eine Verbindung zu einem ISP angegebene IP-Adresse und lösen die lokale Adresse, die der server am laufen?. (sorry, nicht vertraut mit dem jargon noch).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie einen router haben, müssen Sie zum einrichten Port-Weiterleitung. Es hängt wirklich davon ab, welche Art von router Sie haben, so haben Sie, um suchen es für Ihre speziellen ein.
Können Sie keine Bindung zu Ihrem ISP-IP-Adresse, da Sie nicht die eigene (die der router hat). Sie müssen
bind
zu einer IP-Adresse, die Ihr computer tatsächlich besitzt, die sich überipconfig /all
im windows. Dann stellen Sie sicher, dass vorwärts-Verkehr in Ihrem router für den Server Portnummer ein, die der internen IP-Adresse, die Ihr computer verfügt.Wenn Sie versuchen, eine Verbindung zurück zu dem server, verwenden Sie localhost/127.0.0.1 oder die IP-Adresse, die du hörst auf?
Kann es sein, dass der Versuch, eine Verbindung zu 'localhost' versucht, mithilfe der loopback-Schnittstelle die Ihrem Programm nicht hören auf. Ich bin mir nicht 100% sicher, wie es funktioniert in Windows.
Kann ich bitte eine weitere wichtige Frage, eventuell werden Sie aufgefordert, Ihren Entwurf ändern: warum wollen Sie binden an eine bestimmte IP (und localhost)?
können Sie versuchen, mithilfe von cmd ping auf die server IP von deinem client-Seite, um zu sehen, ob es eine Verbindung problem.
Außerdem denke ich, dass dies
in der client-Seite ist falsch, da der port sollte eine ganze Zahl sein.