读书人

socket client中怎么指定本地端口

发布时间: 2013-07-01 12:33:04 作者: rapoo

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。
[解决办法]

引用:

Quote: 引用:

Quote: 引用:

反正我是没见过谁绑定本地端口连接远程端口的。
《TCP/IP详解卷一:协议》

我也没见过客户端要用bind的情况,但不是说客户端不允许bind。

关键是你能保证在你绑定之前该端口没被其它进程的其它连接占用吗?


lz的问题是客户端能不能bind,答案是可以。至于端口是否已被占用,这要lz自己去处理。就算是服务器程序,也一样会有端口被占用问题。

而你说的是操作系统不让,那么请按你常贴的哲学,自己去敲下代码,看看结果是什么。
[解决办法]
bind就行,绑定的是本地的端口,你可以看这的例子:
http://download.csdn.net/detail/geoff08zhang/4571358

读书人网 >C语言

热点推荐