通过通过 adb 转发的端口连接套接字应用程序时出现问题
Issue when connecting a socket application over a port forwarded over adb
我正在开发一个应用程序,它在 PC 和客户端上有一个服务器作为通过 adb (USB) 连接的 android 设备。
我通过以下方式设置了端口转发:adb forward tcp:5100 tcp:5100
每当我尝试 运行 我的 python 服务器时,它会说:
server.bind(("127.0.0.1", 5100))
OSError: [WinError 10048] Only one usage of each socket address (protocol/network address/port) is normally permitted
这是我的服务器代码:
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as server:
#server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server.bind(("127.0.0.1", 5100))
server.listen()
print("Waitng for client Sockets " + socket.gethostname())
conn, address = server.accept()
with conn:
print("Connected to framework", address)
while True:
recvdStr = conn.recv(1024)
if not recvdStr:
break
print("Received: " + recvdStr.decode())
客户代码:
#include <jni.h>
#include <string>
#include <sys/socket.h>
#include <sys/types.h>
#include <arpa/inet.h>
extern "C" JNIEXPORT jstring JNICALL
Java_com_example_testframeworktest_MainActivity_stringFromJNI(
JNIEnv* env,
jobject /* this */) {
std::string hello = "Hello from C++";
int client = socket(AF_INET, SOCK_STREAM, 0);
sockaddr_in serverAddr;
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(5100);
serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
connect(client, (sockaddr*)&serverAddr, sizeof(sockaddr));
send(client, "sending test string", strlen("sending test string"), 0);
send(client, "", strlen(""), 0);
return env->NewStringUTF(hello.c_str());
}
启用端口转发后,netstat -an 显示我的端口是这个状态:
TCP 127.0.0.1:5100 0.0.0.0:0 LISTENING
- 使用 USB 数据线将 phone 连接到 PC。
- 发出命令:adb usb
- 发出命令:adb tcpip 5100
- 发出命令:adb connect xxx.xxx.xxx.xxx
要让 python 服务器代码和 android 客户端相互交谈,您应该使用 adb
反向而不是正向。
这是您应该使用的 adb
命令
adb reverse tcp:5100 tcp:5100
我正在开发一个应用程序,它在 PC 和客户端上有一个服务器作为通过 adb (USB) 连接的 android 设备。
我通过以下方式设置了端口转发:adb forward tcp:5100 tcp:5100
每当我尝试 运行 我的 python 服务器时,它会说:
server.bind(("127.0.0.1", 5100))
OSError: [WinError 10048] Only one usage of each socket address (protocol/network address/port) is normally permitted
这是我的服务器代码:
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as server:
#server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server.bind(("127.0.0.1", 5100))
server.listen()
print("Waitng for client Sockets " + socket.gethostname())
conn, address = server.accept()
with conn:
print("Connected to framework", address)
while True:
recvdStr = conn.recv(1024)
if not recvdStr:
break
print("Received: " + recvdStr.decode())
客户代码:
#include <jni.h>
#include <string>
#include <sys/socket.h>
#include <sys/types.h>
#include <arpa/inet.h>
extern "C" JNIEXPORT jstring JNICALL
Java_com_example_testframeworktest_MainActivity_stringFromJNI(
JNIEnv* env,
jobject /* this */) {
std::string hello = "Hello from C++";
int client = socket(AF_INET, SOCK_STREAM, 0);
sockaddr_in serverAddr;
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(5100);
serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
connect(client, (sockaddr*)&serverAddr, sizeof(sockaddr));
send(client, "sending test string", strlen("sending test string"), 0);
send(client, "", strlen(""), 0);
return env->NewStringUTF(hello.c_str());
}
启用端口转发后,netstat -an 显示我的端口是这个状态:
TCP 127.0.0.1:5100 0.0.0.0:0 LISTENING
- 使用 USB 数据线将 phone 连接到 PC。
- 发出命令:adb usb
- 发出命令:adb tcpip 5100
- 发出命令:adb connect xxx.xxx.xxx.xxx
要让 python 服务器代码和 android 客户端相互交谈,您应该使用 adb
反向而不是正向。
这是您应该使用的 adb
命令
adb reverse tcp:5100 tcp:5100