質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.50%
MFC

MFC (Microsoft Fouondation Class)とは、MicrosoftがVC++用に開発したWindows用アプリケーションのフレームワークです。

ソケット

TCP/IPにおいて、IPアドレスとサブアドレスであるポート番号を組み合わせたネットワークアドレスのことを呼びます。また、ソフトウェアアプリケーションにおいて、TCP/IP通信を行う為の仮想的なインターフェースという意味もある。

TCP

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

C++

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

Q&A

解決済

2回答

9519閲覧

ソケット通信時に自分が指定したIPアドレスから送信されているか確認がしたい。

退会済みユーザー

退会済みユーザー

総合スコア0

MFC

MFC (Microsoft Fouondation Class)とは、MicrosoftがVC++用に開発したWindows用アプリケーションのフレームワークです。

ソケット

TCP/IPにおいて、IPアドレスとサブアドレスであるポート番号を組み合わせたネットワークアドレスのことを呼びます。また、ソフトウェアアプリケーションにおいて、TCP/IP通信を行う為の仮想的なインターフェースという意味もある。

TCP

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

C++

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

0グッド

1クリップ

投稿2019/07/23 08:20

編集2019/07/23 08:21

前提・実現したいこと

C++でソケット通信の学習をしています。
クライアント側でIPアドレスを追加し、BINDでIPアドレスを設定しているつもりなのですが、
ループバックアドレス側の確認用サーバでは"127.0.0.1"から送信されています。
クライアント側のIPアドレスを確認する方法はありますでしょうか?

発生している問題・エラーメッセージ

サーバ側のメッセージ

[接続]('127.0.0.1', 52877)

理想

[接続]('192.168.0.101', 52877)

クライアント側

C++

1 2#define MSGSIZE 1024 3#define BUFSIZE (MSGSIZE+1) 4/* 5 *ここで設定したIPアドレスで送信が行われているか確認したい  6 */ 7#define OWNADDR _T("192.168.0.101") 8#define MASK _T("255.255.255.0") 9#define SERVERIP _T("127.0.0.1") 10#define PORT _T("50001") 11 12//初期設定 13int init(void) { 14 // winsock機能の初期化 15 WORD wVersionRequested; 16 WSADATA wsaData; 17 int err; 18 wVersionRequested = MAKEWORD(2, 2); 19 err = WSAStartup(wVersionRequested, &wsaData); 20 21 CString ownAddr = (OWNADDR); 22 CString mask = (MASK); 23 CString serverIP = (SERVERIP); 24 CString port = (PORT); 25 26 //接続設定 27 int rc; 28 int lSockfd; 29 lSockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 30 31 struct sockaddr_in addr; 32 memset(&addr, 0, sizeof(addr)); 33 34 CStringA addrA, ownAddrA; 35 addrA = serverIP; //接続先IP 36 ownAddrA = m_addr; //接続元IP 37 38 //送信元アドレス・ポート番号設定 39 struct sockaddr_in myAddr; 40 memset(&myAddr, 0, sizeof(myAddr)); 41 42 myAddr.sin_family = AF_INET; 43 myAddr.sin_port = htons(_ttoi(port)); 44 inet_pton(AF_INET, ownAddrA, &myAddr.sin_addr.s_addr); 45 46 rc = bind(sockfd, (struct sockaddr *)&myAddr, sizeof(myAddr)); 47 48 // 送信先アドレス・ポート番号設定 49 struct sockaddr_in addr; 50 memset(&addr, 0, sizeof(addr)); 51 52 addr.sin_family = AF_INET; 53 addr.sin_port = htons(_ttoi(port)); 54 inet_pton(AF_INET, addrA, &addr.sin_addr.s_addr); 55 56 int connectErr = connect(lSockfd, (struct sockaddr *)&addr, sizeof(struct sockaddr_in)); 57 return lSockfd; 58} 59 60//送信処理 61bool chatTransmit(CString mes, int sockfd) { 62 63 // データ送信 64 CStringA str; 65 66 char send_str[BUFSIZE] = {}; 67 68 /* 送信処理 */ 69 int sendVal = send(sockfd, send_str, strlen(send_str), 0); 70 if (sendVal < 0) { 71 CString strData = _T("send error :"); 72 strData.Format(_T("%s%d"), strData, errno); 73 AfxMessageBox(strData); 74 return false; 75 } 76 77 return true; 78} 79 80bool chatEnd(int sockfd) { 81 82 shutdown(sockfd, SD_BOTH); 83 closesocket(sockfd); 84 /* winsock機能の終了 */ 85 WSACleanup(); 86 87 return true; 88}

サーバ側(ループバックアドレス)

Python3

1# -*- coding:utf-8 -*- 2import socket 3import time 4import threading 5 6class socketServer(): 7 def __init__(self): 8 self.host = "127.0.0.1" 9 self.port = 50002 10 self.clients = [] 11 12 def socket_setup(self): 13 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 14 sock.bind((self.host, self.port)) 15 sock.listen(10) 16 17 while True: 18 print('Waiting for connections...') 19 try: 20 conn, addr = sock.accept() #接続されればデータを格納 21 except KeyboardInterrupt: 22 break 23 24 print('testcase1', addr) 25 print("[接続]{}".format(addr)) 26 self.clients.append((conn, addr)) 27 28 thread1 = threading.Thread(target=self.socket_send, args=(conn, addr), daemon=True) 29 thread2 = threading.Thread(target=self.socket_recv, args=(conn, addr), daemon=True) 30 thread1.start() 31 thread2.start() 32 33 def close_connection(self, conn, addr): 34 print('[切断]{}'.format(addr)) 35 # 通信を遮断する 36 conn.close() 37 38 def socket_send(self, conn, addr): 39 cnt = 1 40 while True: 41 try: 42 time.sleep(1) 43 str1 = b'testcase : ' 44 str2 = str(cnt).encode('utf-8') 45 str3 = b'\r\n' 46 s_msg = str1 + str2 +str3 47 if s_msg == '': 48 self.close_connection(conn, addr) 49 break 50 #print('sending...', s_msg) 51 except ConnectionResetError: 52 self.close_connection(conn, addr) 53 break 54 55 cnt = cnt + 1 56 try: 57 sent = conn.sendall(s_msg) #メッセージを返します 58 except ConnectionResetError: 59 self.close_connection(conn, addr) 60 break 61 62 if sent == 0: 63 self.close_connection(conn, addr) 64 break 65 else: 66 print('sending...', s_msg) 67 68 def socket_recv(self, conn, addr): 69 while True: 70 try: 71 # クライアントから送信されたメッセージを 1024 バイトずつ受信 72 data = conn.recv(1024) 73 except ConnectionResetError: 74 # クライアント側でソケットを強制終了(Ctrl + c)すると 75 # ソケットサーバが処理落ちするので、コネクションを切断する 76 self.close_connection(conn, addr) 77 break 78 79 if not data: 80 # データが無い場合、接続を切る 81 self.close_connection(conn, addr) 82 break 83 else: 84 print('recving... {}, addr&port: {}'.format(data.decode("utf-8"), addr)) 85 86 #recv_mes = data.decode() 87 #print('message:{}'.format(recv_mes)) 88 89#main 90ss = socketServer() 91ss.socket_setup() 92

補足情報(FW/ツールのバージョンなど)

クライアント側はMFCで作成のため一部抜粋です。

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

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

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

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

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

t_obara

2019/07/23 09:04

貴殿が確認しようとしているのはループバックインターフェースという論理インターフェースに紐づいているので、物理インターフェース経由ではないからかと。別のPCを利用するか、仮想環境などを入れて、それを利用するなどで試してみてはいかがでしょうか。
退会済みユーザー

退会済みユーザー

2019/07/23 23:21

私はインターフェース回りがよくわかっていないようですね。。別PCは用意できないので、仮想環境を試してみます。ご回答ありがとうございます。
guest

回答2

0

ループバックアドレスへの通信はループバックアドレスから行われます。
192.168.0.101から通信したければ、サーバーも192.168.0.101で立ち上げ、クライアントから192.168.0.101に対して通信してください。

投稿2019/07/23 09:03

otn

総合スコア84423

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

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

退会済みユーザー

退会済みユーザー

2019/07/23 23:36

回答ありがとうございます。 ループバックアドレスを192.168.0.101に変更するとサーバー側が認識できないようです。。。ほかの手段を模索したいと思います。
otn

2019/07/24 01:04

self.host = "0.0.0.0" でやってみてください。
guest

0

ベストアンサー

Wiresharkなどのパケットキャプチャソフトでパケットの生データを見るってのでどうでしょう。
学習用途なら、これしといて損はないと思います

投稿2019/07/23 08:54

y_waiwai

総合スコア87719

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

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

退会済みユーザー

退会済みユーザー

2019/07/23 23:38

回答ありがとうございます。 どうも私の環境下ではWiresharkなるものを使うか仮想環境を構築するくらいしか手段がないようです。。。今後のためにもどちらも試行してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問