🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
TCP

TCP(Transmission Control Protocol)とは、トランスポート層のプロトコルで、コネクション型のデータサービスです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

4312閲覧

C++での外部からのsocket(TCP)通信

退会済みユーザー

退会済みユーザー

総合スコア0

TCP

TCP(Transmission Control Protocol)とは、トランスポート層のプロトコルで、コネクション型のデータサービスです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2019/10/14 13:57

前提・実現したいこと

現在、C++でTCP通信をしたいと考えています。その際、試しに127.0.0.1で実行した際には期待通りの動きをしてくれるのですが、外部からの接続を試そうとすると何をやってもうまくいきません。外部から通信するには何か違う特別なことが必要なのですかね?

発生している問題・試したこと

試したことは
クライアントからの接続をサーバー(このパソコン(有線))のVirtualBoxで(windowsでsocketが使えなかったので)グローバルIPにして
-Wi-Fiで繋がれたMacから接続 <- 出来ない。
-windscribeを使いvpnで外部から接続(mac) <- 出来ない。
-スマホの4Gをテザリングで接続してmacから接続 <- 出来ない。

ここからはダメ元ですが、
次に(このパソコンのVirtualBox(有線))をクライアントにして
-4Gテザリングしたmac(サーバー)にグローバルIPを調べてそれあてに接続 <- 出来ない。
-windscribeでも同じく <- 出来ない。

本当はUnreal Engine4(ゲームエンジン)から接続したかったのでそこからも試しましたがダメでした。
関係ないですが、PythonとUE4のTCP通信ならローカルではできました。しかしc++のデータ(配列)をPythonにできなかったので諦め、、、

該当のソースコード

c++

1//TCPServer.cpp 2 3#include <stdio.h> 4#include <sys/types.h> 5#include <sys/socket.h> 6#include <netinet/in.h> 7#include <arpa/inet.h> 8#include <unistd.h> 9#include <cstring> 10 11int main() 12{ 13 int sock0; 14 struct sockaddr_in addr; 15 struct sockaddr_in client; 16 int len; 17 int sock; 18 char buf[32]; 19 int buf_len; 20 int n; 21 22 /* ソケットの作成 */ 23 sock0 = socket(AF_INET, SOCK_STREAM, 0); 24 25 /* ソケットの設定 */ 26 addr.sin_family = AF_INET; 27 addr.sin_port = htons(64000); 28 addr.sin_addr.s_addr = INADDR_ANY; 29 bind(sock0, (struct sockaddr *)&addr, sizeof(addr)); 30 31 /* TCPクライアントからの接続要求を待てる状態にする */ 32 while(1){ 33 listen(sock0, 5); 34 35 /* TCPクライアントからの接続要求を受け付ける */ 36 len = sizeof(client); 37 sock = accept(sock0, (struct sockaddr *)&client, (socklen_t *)&len); 38 39 memset(buf, 0, sizeof(buf)); 40 n = read(sock, buf, sizeof(buf)); 41 printf("%d, %s\n", n, buf); 42 43 /* 5文字送信 */ 44 write(sock, "HELLO", 5); 45 } 46 /* TCPセッションの終了 */ 47 close(sock); 48 49 /* listen するsocketの終了 */ 50 close(sock0); 51 52 return 0; 53}

C++

1//TCPClient.cpp 2 3#include <stdio.h> 4#include <sys/types.h> 5#include <sys/socket.h> 6#include <netinet/in.h> 7#include <netinet/ip.h> 8#include <arpa/inet.h> 9#include <unistd.h> 10#include <cstring> 11 12int 13main() 14{ 15struct sockaddr_in server; 16int sock; 17char buf[32]; 18int buf_len; 19int n; 20 21/* ソケットの作成 */ 22sock = socket(AF_INET, SOCK_STREAM, 0); 23 24/* 接続先指定用構造体の準備 */ 25server.sin_family = AF_INET; 26server.sin_port = htons(64000); 27server.sin_addr.s_addr = inet_addr("163.58.70.16"); 28 29/* サーバに接続 */ 30connect(sock, (struct sockaddr *)&server, sizeof(server)); 31 32strcpy(buf, "BUNBUN HELLO YOUTUBE"); 33buf_len = 32; 34write(sock, buf, buf_len); 35/* サーバからデータを受信 */ 36memset(buf, 0, sizeof(buf)); 37n = read(sock, buf, sizeof(buf)); 38 39printf("%d, %s\n", n, buf); 40 41/* socketの終了 */ 42close(sock); 43 44return 0; 45}

ここに問題に対して試したことを記載してください。

補足情報

いろんなサイトを見ながら書いたのでこれでいいのかよくわからないのですが致命的な欠陥とかありませんよね?

見にくくてすみません。
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2019/10/14 14:24

ネットワーク構成を図示してください。
退会済みユーザー

退会済みユーザー

2019/10/14 17:11

ありがとうございます。 あまり詳しくないので図示と言われても何を書けばいいのかわかりません。 今回の件はVirtualBoxでのポートフォワーディングの設定をし忘れていました。 こんな簡単な質問に回答してくださりありがとうございました。
guest

回答2

0

同一PC上で正常動作するならばプログラムではなく環境の方に問題がありそうですね。

ファイアウォールやルータのポート変換の可能性があります。

投稿2019/10/14 14:59

HogeAnimalLover

総合スコア4830

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/10/14 17:09

ありがとうございます。 ファイアウォール等は切っていたのですが、VirtualBoxでのポートフォワーディングの設定をし忘れていました。ホストコンピュータの設定だけして油断してしまいました。 こんな簡単な質問に答えていただきありがとうございました。
guest

0

ベストアンサー

こんにちは。

PC内での接続に成功しPCの外からの接続に失敗する場合は、多くのケースでウィンドウズ・ファイヤウォールやアンチウィルス等により、ファイヤウォールにより接続が遮断されています。

本当にそうなのか確認する時は、まずはインターネット接続の保護を無効にして接続してみるとよいです。
それで接続できるようになったら必要な接続を許可すると良いです。

投稿2019/10/14 14:10

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/10/14 17:09

ありがとうございます。 ファイアウォール等は切っていたのですが、VirtualBoxでのポートフォワーディングの設定をし忘れていました。ホストコンピュータの設定だけして油断してしまいました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問