これは私の2番目の話です。クライアントが送信したものを出力する以下のようなサーバーアプリケーションを作成しました。私はクライアントがローカルホストに接続するように指定した場合、クライアントを使用してサーバに接続できるようにしているので、何かをlistenするserver.exeバージョンが1つあります。localhostではなくIPアドレスに接続していますか?
ローカルホストの代わりに自分のIPアドレスを使用すると、サーバーに接続できません。この方法でサーバーに接続することはできませんか。
私はINADDR_ANY
を持たずに自分のIPアドレスを使用するようにハードコードされた別のSERVER.EXEを使用しますが、着信接続にbind()
またはlisten()
することができませんでした。私はどのように進めるのか混乱している。
(私は、同じマシン上のサーバとクライアントを実行していますが、その問題あり?)
サーバー
#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*/
#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;
}
同じマシン上でサーバーとクライアントを実行することは間違いありません。私は使用しているIPアドレスがあなたのマシンが所有しているアドレスではないと思っています。あなたのサーバーはパブリックアドレスを持っていますか?またはプライベートアドレス? ipconfigコマンドで報告されたIPアドレスを与えてもよろしいですか? – Srikanth
あなたは私のマシンのIPアドレスではなく、私のISPから提供されたIPアドレスです。私は複数のコンピュータをwifi経由で接続していますが、私は自分の外部IPに接続しようとしていました(私のISPから与えられたIPアドレスの名前ですか)。 – silent
どのようにしてISPに接続してIPアドレスを与え、サーバが動作しているローカルアドレスを解決するのですか? (まだ専門用語に慣れていないのは申し訳ありません)。 – silent