VMWareの仮想環境上に構築したUbuntuとWindows間でソケット通信を行おうとしています。
環境は以下の通りです。
OS:Ubuntu-ja-20.04(こちらから入手)
<クライアント側>
・OS:Windows10 Home
・VMWare:Ver.15.5.6
・VisualStudio:Express 2013
実行したコードは以下です。(こちらのコードを参考。)
・クライアント
C++
1#include <winsock2.h> 2#include <stdio.h> 3#include <iostream> 4#include <string> 5 6#define SEVER_IP_ADDRESSE "192.168.11.8" 7#define SERVER_PORT 12345 8 9#define BUFSIZE 256 10#define RECVSIZE 65536 11 12#define SLEEP_TIME 1 13 14using namespace std; 15 16int main() { 17 18 // セットアップ 19 WSADATA wsaDate; 20 // サーバー情報 21 SOCKADDR_IN server; 22 23 // 初期化 24 WSAStartup(MAKEWORD(2, 0), &wsaDate); 25 26 // ソケット生成 27 int soc; 28 char sendBuf[BUFSIZE]; 29 char recvBuf[RECVSIZE]; 30 int recvLen = 0; 31 32 soc = socket(AF_INET, SOCK_STREAM, 0); 33 34 // サーバーアドレス情報 35 server.sin_family = AF_INET; 36 server.sin_port = htons(SERVER_PORT); 37 server.sin_addr.S_un.S_addr = inet_addr(SEVER_IP_ADDRESSE); 38 39 //// サーバーに接続 40 //if ( connect(soc,(LPSOCKADDR)&server, sizeof(server)) < 0); 41 //{ 42 // printf("サーバーへの接続失敗です%d\n",WSAGetLastError()); 43 // closesocket(soc); 44 // return -1; 45 //} 46 47 // データをサーバーに送信 48 while (true) 49 { 50 string sendText; 51 connect(soc, (LPSOCKADDR)&server, sizeof(server)); 52 53 cin >> sendText; 54 cout << "send:" << sendText << endl; 55 if (send(soc, sendText.c_str(), sendText.size(), 0) == SOCKET_ERROR) 56 { 57 printf("サーバーへの送信失敗です%d\n", WSAGetLastError()); 58 closesocket(soc); 59 sendText.clear(); 60 return -1; 61 } 62 else 63 { 64 // 受信 65 recvLen = recv(soc, recvBuf, RECVSIZE, 0); 66 string receive(recvBuf, recvLen); 67 cout << "receve:" << receive << WSAGetLastError() << endl; 68 } 69 Sleep(SLEEP_TIME); 70 71 } 72 73 // 終了 74 closesocket(soc); 75 WSACleanup(); 76 return 0; 77} 78
・サーバー側
C++
1#include <stdio.h> 2#include <sys/types.h> 3#include <sys/socket.h> 4#include <netinet/in.h> 5#include <arpa/inet.h> 6#include <unistd.h> 7#include <memory.h> 8 9#define SERVER_PORT 12345 10#define BUFSIZE 1024 11 12int main() 13{ 14 15 int socfd; // サーバー側のソケット 16 int client_soc; // クライアント側のソケット 17 struct sockaddr_in addr; // アドレスを入れる箱 18 19 FILE* fp; 20 21 socklen_t len = sizeof(struct sockaddr_in); 22 struct sockaddr_in from_addr; 23 24 char buf[BUFSIZE]; 25 26 // 受信バッファ初期化 27 memset(buf,0,sizeof(buf)); 28 29 // ソケット生成 30 if((socfd = socket(AF_INET,SOCK_STREAM,0)) < 0) 31 { 32 perror("socket"); 33 } 34 35 // 待ち受け用IP・ポート番号設定 36 //アドレスファミリ IPV4 37 // ポート番号 11110 38 addr.sin_family = AF_INET; 39 addr.sin_port = htons(SERVER_PORT); 40 addr.sin_addr.s_addr = INADDR_ANY; 41 42 // バインド 43 if(bind(socfd,(struct sockaddr *)&addr,sizeof(addr)) < 0) 44 { 45 perror("bind"); 46 } 47 48 // 受信待ち 49 // listen(接続待ちソケット,バックログ(接続を待機させる最大数)) 50 if(listen(socfd,SOMAXCONN) < 0) 51 { 52 perror("listen"); 53 } 54 55 56 // 受信 57 int rsize; 58 while(1) 59 { 60 // クライアントからのコネクト要求待ち 61 if((client_soc = accept(socfd,(struct sockaddr*)&from_addr,&len)) < 0) 62 { 63 perror("accept"); 64 } 65 // rsize = recv(client_soc,buf,sizeof(buf),0); 66 67 while(rsize = read(client_soc ,buf , sizeof(buf)) > 0 ) 68 { 69 fp = fopen("ScoreData.txt","a"); 70 71 if(fp == NULL) 72 { 73 perror("ファイルの読み込みに失敗\n"); 74 return -1; 75 } 76 77 78 fprintf(fp,"%s",buf); 79 fclose(fp); 80 81 //Send the message back to client 82 write(client_soc , buf , strlen(buf)); 83 memset( &buf, 0, sizeof(buf)); 84 } 85 86 if(rsize == 0) 87 { 88 puts("Client disconnected"); 89 fflush(stdout); 90 } 91 else if(rsize == -1) 92 { 93 perror("recv failed"); 94 } 95 96 } 97 98 // ソケットクローズ 99 close(client_soc); 100 close(socfd); 101 102 return 0; 103}
上記クライアント側の「SEVER_IP_ADDRESSE "192.168.74.128"」は、サーバーでifconfigで出てきたブロードキャストのアドレスです。
Ubuntuでサーバー側のコードを実行し、クライアントからのコネクト要求待ちをするaccept関数のところで待ち状態になります。
この状態で、Windows側でクライアント側のコードを実行すると、サーバーに接続するconnect関数のところで失敗し、「サーバーへの接続失敗です」のメッセージが出力されます。
サーバーのIPアドレスかポート番号が間違っていると思い、以下を試しました。
1.VMWareの設定でネットワークアダプタの設定をブリッジに設定
2.VMWareの設定でネットワークの設定をNATに設定、シリアルポートで「物理シリアルポートを使用する」を選択
1,2を行ったのですが、いずれも現象は同じでした。
VmWareのIPアドレスとポートはどうやって設定するか、また、それ以外につながらない原因はあるが分かる方がおられましたら、宜しくお願い致します。
回答1件
あなたの回答
tips
プレビュー