socket client中如何指定本地端口?

_菜菜 2013-05-31 01:37:32
如题,我要用本机指定的端口去连接服务器,如何指定?
...全文
12044 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
ShengFei01 2013-05-31
  • 打赏
  • 举报
回复
bind就行,绑定的是本地的端口,你可以看这的例子: http://download.csdn.net/detail/geoff08zhang/4571358
赵4老师 2013-05-31
  • 打赏
  • 举报
回复
引用 15 楼 luciferisnotsatan 的回复:
[quote=引用 14 楼 zhao4zhong1 的回复:] [quote=引用 13 楼 luciferisnotsatan 的回复:] [quote=引用 10 楼 zhao4zhong1 的回复:] 反正我是没见过谁绑定本地端口连接远程端口的。 《TCP/IP详解卷一:协议》
我也没见过客户端要用bind的情况,但不是说客户端不允许bind。[/quote] 关键是你能保证在你绑定之前该端口没被其它进程的其它连接占用吗?[/quote] lz的问题是客户端能不能bind,答案是可以。至于端口是否已被占用,这要lz自己去处理。就算是服务器程序,也一样会有端口被占用问题。 而你说的是操作系统不让,那么请按你常贴的哲学,自己去敲下代码,看看结果是什么。[/quote] 以我之矛,攻我之不靠谱的言论。结果是……
luciferisnotsatan 2013-05-31
  • 打赏
  • 举报
回复
引用 14 楼 zhao4zhong1 的回复:
[quote=引用 13 楼 luciferisnotsatan 的回复:] [quote=引用 10 楼 zhao4zhong1 的回复:] 反正我是没见过谁绑定本地端口连接远程端口的。 《TCP/IP详解卷一:协议》
我也没见过客户端要用bind的情况,但不是说客户端不允许bind。[/quote] 关键是你能保证在你绑定之前该端口没被其它进程的其它连接占用吗?[/quote] lz的问题是客户端能不能bind,答案是可以。至于端口是否已被占用,这要lz自己去处理。就算是服务器程序,也一样会有端口被占用问题。 而你说的是操作系统不让,那么请按你常贴的哲学,自己去敲下代码,看看结果是什么。
赵4老师 2013-05-31
  • 打赏
  • 举报
回复
引用 13 楼 luciferisnotsatan 的回复:
[quote=引用 10 楼 zhao4zhong1 的回复:] 反正我是没见过谁绑定本地端口连接远程端口的。 《TCP/IP详解卷一:协议》
我也没见过客户端要用bind的情况,但不是说客户端不允许bind。[/quote] 关键是你能保证在你绑定之前该端口没被其它进程的其它连接占用吗?
luciferisnotsatan 2013-05-31
  • 打赏
  • 举报
回复
引用 10 楼 zhao4zhong1 的回复:
反正我是没见过谁绑定本地端口连接远程端口的。 《TCP/IP详解卷一:协议》
我也没见过客户端要用bind的情况,但不是说客户端不允许bind。
luciferisnotsatan 2013-05-31
  • 打赏
  • 举报
回复
引用 10 楼 zhao4zhong1 的回复:
反正我是没见过谁绑定本地端口连接远程端口的。 《TCP/IP详解卷一:协议》
TCP/IP详解卷一里讲协议的,没有具体到bind函数吧。卷二里 15.8 bind系统调用,第一段说了客户通常不关心本地地址,不必调用bind。但不是指不能,不被允许调用bind 另见《UNIX 网络编程 卷1》 bind 部分。书的作者是同一人。
忘世麒麟 2013-05-31
  • 打赏
  • 举报
回复
引用 10 楼 zhao4zhong1 的回复:
反正我是没见过谁绑定本地端口连接远程端口的。 《TCP/IP详解卷一:协议》
确实没有必要绑定“自己”。否则代码就出现了明显的冗余。而且从思维角度来说也不畅。
赵4老师 2013-05-31
  • 打赏
  • 举报
回复
反正我是没见过谁绑定本地端口连接远程端口的。 《TCP/IP详解卷一:协议》
luciferisnotsatan 2013-05-31
  • 打赏
  • 举报
回复
引用 6 楼 zhao4zhong1 的回复:
通常bind只用于选择用哪个端口侦听,或用哪个网卡或哪个IP对应的某个端口侦听吧。
这个是通常的服务器做法。 绑定一个本地地址到套接字,然后用listen函数告诉内核,接受指向该套接字的连接请求
luciferisnotsatan 2013-05-31
  • 打赏
  • 举报
回复 1
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的
赵4老师 2013-05-31
  • 打赏
  • 举报
回复
在cmd窗口里面输入命令: netstat -na 看看吧
赵4老师 2013-05-31
  • 打赏
  • 举报
回复
通常bind只用于选择用哪个端口侦听,或用哪个网卡或哪个IP对应的某个端口侦听吧。
luciferisnotsatan 2013-05-31
  • 打赏
  • 举报
回复
引用 3 楼 zhao4zhong1 的回复:
操作系统不让。
可以bind的,只不过通常没人这么用。
_菜菜 2013-05-31
  • 打赏
  • 举报
回复
引用 3 楼 zhao4zhong1 的回复:
操作系统不让。
那就是说没办法了?UDP也不行吗?delphi里边都可以指定本地端口啊
赵4老师 2013-05-31
  • 打赏
  • 举报
回复
操作系统不让。
_菜菜 2013-05-31
  • 打赏
  • 举报
回复
不是,我是想用本机的5060端口连接服务器的5060端口,而不是随机产生一个端口
starytx 2013-05-31
  • 打赏
  • 举报
回复
什么叫如何指定?你是问怎么连接服务器吗?

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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