怎样在socket代码中获得由内核自动分配的端口号
来源:互联网 发布:easyui tree加载数据 编辑:程序博客网 时间:2024/05/21 09:31
http://bbs.chinaunix.net/thread-1460809-2-1.html
请教一个问题,我正在写一个linux上ftp客户端程序,遇到一个问题,请各位大侠帮助。
根据ftp协议,客户端将会通过port命令将客户端建立的一个监听端口发给ftp服务器,然后ftp服务器将connect到该端口上,如果在客户端程序中强制设置一个端口,当然可以,但是我希望由内核自动分配一个可用端口。我们知道通常设置sockaddr_in的sin_port字段为0,就是告诉内核自己分配,但是这样在客户端代码中就无法正确得到这个端口值了,因为客户端代码中总是0,谁能提醒下俺呢? 谢谢!
getsockname()
getsockname函数不行
我已经试过getsockname函数,该函数返回的端口仍然是0(printf函数中返回的值仍然是0),如下代码所示:
---------------------------------------------------------------------------------------
155 memset (&local_addr, 0, sizeof local_addr);
156 local_addr.sin_family = AF_INET;
157 local_addr.sin_addr.s_addr = htonl (INADDR_ANY);
158 local_addr.sin_port = 0;
159
160 /* bind client's passive process to server listening socket */
161 if ((bind
162 (sockfd_data, (struct sockaddr *) (&local_addr),
163 sizeof local_addr)) == -1)
164 {
165 fprintf (stderr, "Bind error: %s\a\n", strerror (errno));
166 exit (1);
167 }
168
169 /* concat port to parm */
170 getsockname(sockfd_data, (struct sockaddr*)&local_addr, &sin_size);
171 port=ntohs(local_addr.sin_port);
172
173 printf("in child process port is: %d\n", port);
---------------------------------------------------------------------------------------
155 memset (&local_addr, 0, sizeof local_addr);
156 local_addr.sin_family = AF_INET;
157 local_addr.sin_addr.s_addr = htonl (INADDR_ANY);
158 local_addr.sin_port = 0;
159
160 /* bind client's passive process to server listening socket */
161 if ((bind
162 (sockfd_data, (struct sockaddr *) (&local_addr),
163 sizeof local_addr)) == -1)
164 {
165 fprintf (stderr, "Bind error: %s\a\n", strerror (errno));
166 exit (1);
167 }
168
169 /* concat port to parm */
170 getsockname(sockfd_data, (struct sockaddr*)&local_addr, &sin_size);
171 port=ntohs(local_addr.sin_port);
172
173 printf("in child process port is: %d\n", port);
你是bind() listen()之后么
就是bind后,没有在listen后面,我想的是一旦绑定后,子进程就通知父进程已获得一个端口号,于是父进程就可以开始发送port命令了
我这里的strace结果复制代码
- bind(7, {sa_family=AF_INET, sin_port=htons(0), sin_addr=inet_addr("xxxxxx")}, 16) = 0
- listen(7, 128) = 0
- getsockname(7, {sa_family=AF_INET, sin_port=htons(31415), sin_addr=inet_addr("xxxxx")}, [16]) = 0
我将代码移到listen后,printf打出的结果仍然为0呢?郁闷
---------------------------------------------------------------
172 if (listen (sockfd_data, 5))
173 {
174 fprintf (stderr, "Listen error: %s\n\a", strerror (errno));
175 exit (1);
176 }
177
178 getsockname(sockfd_data, (struct sockaddr*)&local_addr, &sin_size);
179 port=ntohs(local_addr.sin_port);
180
181 printf("in child process port is: %d\n", port);
---------------------------------------------------------------
172 if (listen (sockfd_data, 5))
173 {
174 fprintf (stderr, "Listen error: %s\n\a", strerror (errno));
175 exit (1);
176 }
177
178 getsockname(sockfd_data, (struct sockaddr*)&local_addr, &sin_size);
179 port=ntohs(local_addr.sin_port);
180
181 printf("in child process port is: %d\n", port);
我发现一个问题,如果是单独的一个程序通过getsockname可以得到内核分配的端口,但是在我这个多进程的ftp客户端中就始终得不到
sin_size赋值了么?
果然,我忘了赋值了,我的赋值刚好在getsockname的后面。
非常感谢风行者!
非常感谢风行者!
- 怎样在socket代码中获得由内核自动分配的端口号
- 内核自动分配端口号范围
- 怎样获得Access中自动编号的值
- Java中怎样由枚举常量的ordinal值获得枚举常量对象
- 深度探索Linux内核之自动分配UDP本地端口
- 怎样在JSTL标签中获得集合的长度
- 在js中怎样获得checkbox里选中的多个值?
- 在js中怎样获得checkbox里选中的多个值?
- 在js中怎样获得checkbox里选中的多个值
- 在js中怎样获得checkbox里选中的多个值?
- 在网络通讯中,如何自己分配可用的端口号和获取自己的ip地址
- 在内核中分配物理地址连续的大内存.
- 在内核中分配连续的物理内存
- 如何在代码中对由框架自动生成的单据分录三个小按钮设置状态?
- 如何在代码中对由框架自动生成的单据分录三个小按钮设置状态?
- 在内核中通过/proc/kallsyms获得符号的地址
- 在内核中通过/proc/kallsyms获得符号的地址
- 在内核中通过/proc/kallsyms获得符号的地址
- socket资源列表
- 创建根文件系统的的sh文件源码 1
- API设计:用流畅接口构造内部DSL
- WCF Note8(Client)
- Ubuntu 11.10下卸载vmware workstation7的方法
- 怎样在socket代码中获得由内核自动分配的端口号
- poj-1159题解
- 小问题收集
- ASP.NET回调实现AJAX
- 你会做Web上的用户登录功能吗?
- 图解Ubuntu 11.10下安装vmware workstation 8
- Struts1.2集成jfreechart的简单示例
- 相片
- Eclipse插件安装方法