前提・実現したいこと
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で作成のため一部抜粋です。

回答2件
あなたの回答
tips
プレビュー