socket client中如何指定本地端口?
如题,我要用本机指定的端口去连接服务器,如何指定?
分享到:
------解决方案--------------------
引用:操作系统不让。
可以bind的,只不过通常没人这么用。
------解决方案--------------------
bind是把一个本地协议地址赋予一个套接字的。
// Create a SOCKET for connecting to server
SOCKET ConnectSocket;
ConnectSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (ConnectSocket == INVALID_SOCKET) {
printf("Error at socket(): %ld\n", WSAGetLastError());
WSACleanup();
return 1;
}
//----------------------
// The sockaddr_in structure specifies the address family,
// IP address, and port of the server to be connected to.
sockaddr_in clientService;
clientService.sin_family = AF_INET;
clientService.sin_addr.s_addr = inet_addr( "74.125.128.147" );
clientService.sin_port = htons( 80 );
sockaddr_in client;
client.sin_family = AF_INET;
client.sin_addr.s_addr = htonl(INADDR_ANY);
client.sin_port = htons(12345);
if (bind( ConnectSocket, (SOCKADDR*) &client, sizeof(client)) == SOCKET_ERROR) {
printf("bind() failed.\n");
closesocket(ConnectSocket);
return 1;
}
//----------------------
// Connect to server.
if ( connect( ConnectSocket, (SOCKADDR*) &clientService, sizeof(clientService) ) == SOCKET_ERROR) {
printf( "Failed to connect.\n" );
WSACleanup();
return 1;
}
printf("Connected to server.\n");
system("pause");
然后netstat -na 可以看到:
TCP x.x.x.x:12345 74.125.128.147:80 ESTABLISHED
x是我的本地地址,隐去了。74是www.google.com的
------解决方案--------------------
引用:反正我是没见过谁绑定本地端口连接远程端口的。
《TCP/IP详解卷一:协议》
TCP/IP详解卷一里讲协议的,没有具体到bind函数吧。卷二里 15.8 bind系统调用,第一段说了客户通常不关心本地地址,不必调用bind。但不是指不能,不被允许调用bind
另见《UNIX 网络编程 卷1》 bind 部分。书的作者是同一人。
------解决方案--------------------
引用:反正我是没见过谁绑定本地端口连接远程端口的。
《TCP/IP详解卷一:协议》
我也没见过客户端要用bind的情况,但不是说客户端不允许bind。
------解决方案--------------------