客户端怎么设置固定端口

elegant87 2012-07-19 09:46:49

SOCKET srvSock;
SOCKET clientSock;
SOCKADDR_IN servAddr;//服务器地址信息
SOCKADDR_IN nodeAddr;//客户端端的地址信息
srvSock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
clientSock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);

servAddr.sin_family = AF_INET;
servAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
servAddr.sin_port = htons(SERVERNODE);

nodeAddr.sin_family = AF_INET;
nodeAddr.sin_addr.s_addr = htonl(INADDR_ANY);
//设置客户端固定端口为5153
nodeAddr.sin_port = htons(5153);

//绑定客户端的地址信息,使得客户端的端口号固定
bind(clientSock,(SOCKADDR*)&nodeAddr,sizeof(SOCKADDR));
//或者绑定 bind(srvSock,(SOCKADDR*)&nodeAddr,sizeof(SOCKADDR));
if(connect(srvSock,(SOCKADDR*)&servAddr,sizeof(SOCKADDR))==-1)
return FALSE;

我在客户端按照上面代码做的,但是从服务器端获取客户端的端口号不是5153.不是固定的。,服务器端程序如下:


Accept = WSAAccept(ListenNode,(SOCKADDR*)&RemoteAddr,&RemoteLen,NULL,0);
if(Accept == SOCKET_ERROR)
{
printf("接收连接失败,错误代码: %d\n", WSAGetLastError());
return 0;
}
//printf("客户端端口号为: %d\n",inet_ntoa(RemoteAddr.sin_addr));
printf("客户端端口号为: %d\n",RemoteAddr.sin_port); //输出不是5153

大家帮忙看看,怎么设置客户端的固定端口
...全文
1159 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
LZNJ06 2012-08-13
  • 打赏
  • 举报
回复

SOCKET clientSock;
SOCKADDR_IN nodeAddr;//客户端端的地址信息
clientSock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
nodeAddr.sin_family = AF_INET;
nodeAddr.sin_addr.s_addr = htonl(INADDR_ANY);
//设置客户端固定端口为5153
nodeAddr.sin_port = htons(5153);

//绑定客户端的地址信息,使得客户端的端口号固定
bind(clientSock,(SOCKADDR*)&nodeAddr,sizeof(SOCKADDR));
//或者绑定 bind(srvSock,(SOCKADDR*)&nodeAddr,sizeof(SOCKADDR));

nodeAddr.sin_family = AF_INET;
nodeAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
nodeAddr.sin_port = htons(85);//要连接的服务端端口号

if(connect(clientSock,(SOCKADDR*)&nodeAddr,sizeof(SOCKADDR))==-1)
return FALSE;
fujialin2011 2012-08-13
  • 打赏
  • 举报
回复
这个涉及到端口映射问题,要是你在公网上你可以设置你路由的端口映射来实现固定端口,要是不设置,你每次去连接外面,NAT都会给你随机分配一个映射端口,也就是外面服务器看到的你的端口
码农-彬少 2012-08-13
  • 打赏
  • 举报
回复
楼上正解哈
Panke 2012-08-13
  • 打赏
  • 举报
回复
楼上正解哈
guolaikk 2012-07-25
  • 打赏
  • 举报
回复
哦,对了。 你服务器端这个
[Quote=引用 楼主 :]
printf("客户端端口号为: %d\n",RemoteAddr.sin_port); //输出不是5153
[/Quote]

这里的端口号,从网络字节序转化为本地字节序了吗
guolaikk 2012-07-25
  • 打赏
  • 举报
回复
这个方法我用过。
bind绑定是可行的,也就是说楼主的思路是对的,具体问题出在哪,这个只能自己去排查了。
MingoJ 2012-07-24
  • 打赏
  • 举报
回复
楼上都是正解
Jake443403168 2012-07-20
  • 打赏
  • 举报
回复
本地端口如果中间有NAT设备,接入外网会进行映射,不同的NAT设备映射方式也不尽相同
zhanshen2891 2012-07-20
  • 打赏
  • 举报
回复
这说明你的客户端机器在NAT后面,NAT会自动重新分配端口。
z8323664 2012-07-19
  • 打赏
  • 举报
回复
路由器会随机分配一个端口跟服务器通信 看看UPNP 端口映射
hurryboylqs 2012-07-19
  • 打赏
  • 举报
回复
在服务器看到的客户端的端口并不是你机器上的端口 而是路由器的外网端口

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧