前提・実現したいこと
現在、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}
ここに問題に対して試したことを記載してください。
補足情報
いろんなサイトを見ながら書いたのでこれでいいのかよくわからないのですが致命的な欠陥とかありませんよね?
見にくくてすみません。
よろしくお願いします。
回答2件
あなたの回答
tips
プレビュー