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详解卷一里讲协议的,没有具体到bind函数吧。卷二里 15.8 bind系统调用,第一段说了客户通常不关心本地地址,不必调用bind。但不是指不能,不被允许调用bind
另见《UNIX 网络编程 卷1》 bind 部分。书的作者是同一人。
[解决办法]
我也没见过客户端要用bind的情况,但不是说客户端不允许bind。
[解决办法]
lz的问题是客户端能不能bind,答案是可以。至于端口是否已被占用,这要lz自己去处理。就算是服务器程序,也一样会有端口被占用问题。
而你说的是操作系统不让,那么请按你常贴的哲学,自己去敲下代码,看看结果是什么。
[解决办法]
bind就行,绑定的是本地的端口,你可以看这的例子:
http://download.csdn.net/detail/geoff08zhang/4571358