TCP接続には2つの同一のエンドがあり、確立されていれば互いに区別できません。 両端にIPアドレスとポート番号があり、他のコンピュータからデータを送信する必要があります。
connect
機能は、クライアントに伝え、サーバが
でリッスンしているIPアドレスとポートがbind
機能は、サーバからの応答をリッスンするIPアドレスとポートをクライアントに伝えます。 bind()
に電話しないと、オペレーティングシステムは自動的に適切な値を選択します。
オペレーティングシステムが間違ったデフォルトIPアドレスを選択しているという問題があります。これは、バインド関数が入る場所です。
以下は、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);
}
また、TCPClientとして? – JavaCake
@ JavaCakeはい、バインド機能は、まれに、1つ以上のインターフェイスが宛先に到達できる場合に、サーバーに接続するときにも機能します。使用法はまったく同じです。connect()を呼び出す前にsocket()を作成してアドレスにbind()してください。 –
トリックをやってくれてありがとう.-) – JavaCake