TCP接続には2つの同一の端があり、一度確立されると互いに区別できなくなります。両端にはIPアドレスとポート番号があり、他のコンピューターがデータを送信する必要があります。
このconnect
関数は、サーバーがリッスンしているIPアドレスとポートをクライアントに通知します
このbind
関数は、サーバーからの応答をリッスンする必要があるIPアドレスとポートをクライアントに通知します。電話をかけない場合bind()
、オペレーティングシステムは自動的に適切な値を選択します。
(あなたが言ったことから)あなたが抱えている問題は、オペレーティングシステムが間違ったデフォルトのIPアドレスを選択しているということです。これがbind関数の出番です。
以下は、のアドレスにバインドするコードの(テストされていない)修正されたコピーです192.168.100.2
。これを、使用するインターフェースに属するアドレスに変更する必要があります。
ターミナルを開いて入力ifconfig -a
すると、すべてのインターフェースとそれぞれに属するIPアドレスのリストが出力されます。192.168.100.2
次のコードの値を、使用するインターフェイスに属するIPアドレスに置き換える必要があります。
int sock, bytes_recieved;
char send_data[1024],recv_data[1024];
struct hostent *host;
struct sockaddr_in server_addr, local_addr; //Added a new variable in here for our local address
host = gethostbyname("192.168.100.4"); //This is the address of the server we are connecting to
cout << "Start" << endl;
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
// perror("Socket");
cout << "Socket error" << endl;
exit(1);
}
//Now we want to bind an IP address
//This is an IP address that belongs to your computer, that will be used as the reply IP address
local_addr.sin_family = AF_INET;
local_addr.sin_addr.s_addr = inet_addr("192.168.100.2"); //CHANGE THIS: this is an address on your computer
local_addr.sin_port = htons(0); //Leave this as 0 and the operating system will choose a unused one for you
if bind(sock, (struct sockaddr *)&local_addr, sizeof(local_addr)) == -1)
{
// perror("Bind");
cout << "Bind error" << endl;
exit(1);
}
//Set up the structure that tells us what server to connect to
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(30002);
server_addr.sin_addr = *((struct in_addr *)host->h_addr);
bzero(&(server_addr.sin_zero),8);
//And connect to the server
if (connect(sock, (struct sockaddr *)&server_addr,
sizeof(struct sockaddr)) == -1)
{
// perror("Connect");
cout << "Connect error" << endl;
exit(1);
}