| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 8168 人关注过本帖
标题:如何获得bing绑定端口的端口号
只看楼主 加入收藏
lyl930130
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:323
专家分:111
注 册:2013-5-13
结帖率:91.43%
收藏
已结贴  问题点数:20 回复次数:8 
如何获得bing绑定端口的端口号
用addr_listen.sin_port=htons(0)绑定一个系统分配的端口,如何获得该端口号
搜索更多相关主题的帖子: 如何 
2016-04-15 00:13
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:20 
如果你是用于服务器端,不可以htons(0),否则客户端怎么知道接收端的端口?
对于客户端,才可以htons(0),让系统随便分配一个地址,这种情况下,客户端需要知道它的端口干什么?
2016-04-15 08:42
lyl930130
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:323
专家分:111
注 册:2013-5-13
收藏
得分:0 
回复 2楼 rjsp
是这么的。
最开始服务器监听的是80端口,客户端连接的也是80端口。
但是这个端口只用来监听客户端的连接。一有连接,服务器就再另外监听一个新的端口,并把该端口号通过80发回客户端,然后客户端断开连接,重新connect新的端口。


我自己写的C/S通信,用的端口复用,一个端口同时对应多个客户端的连接。
不传文件,只是简短的传输数据没有问题,但是只要一传大文件,比如一部电影,就会出现传过去1024字节,只收到几百字节的情况。想解决这个问题,目前只想到每个客户端单独分配一个端口。因为之前一个端口只对应一个客户端的时候,传大文件是没有问题的。
2016-04-15 21:08
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 
你的算法不对呀,listen函数本来就干这事,不需要你断开。而且只要有数据传输,对方就知道了你的端口号,何必重复将端口号送一次?

对于tcp数据流,怎么能从字节数上判断?它是“流”,不是“包”
2016-04-16 02:03
lyl930130
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:323
专家分:111
注 册:2013-5-13
收藏
得分:0 
回复 4楼 rjsp
关于第一个问题:
服务器:                                   
程序代码:
 sock_listen.sin_port=htons(80);
while(1)
{
listen(sock_listen)
{
    SOCKET sock_tmp,sock_client;
    sock_tmp=accept(sock_listen);
    {
        sock_client=(AF_INET,SOCK_STREAM,0);
        Create_Thread(sock_client);//单独开一个线程监听该端口,和客户端交互数据
        Port=GetPort(sock_client);//这个就是要问的函数
        send(sock_tmp,Port,sizeof(Port),0);
    }
}
}


关于第二个问题:
数据流和数据包这个问题,我还没有理解清楚。但是现在我是这么做的:
服务器:
程序代码:
while(1)
{
    memset(data,0,sizeof(data));
    ReadFile(hFile,data,1024,&len,NULL);
    send(sock,data,1024,0);
    if(len<1024)
    {   
        send(sock,"over",1024,0);
        break;
    }
}


客户端:
程序代码:
while(1)
{
    ret=recv(sock,data,1024,0);
    if(strcmp(data,"over")==0)
        break;
    WriteFile(hFile,data,1024,&len,NULL);
}


不知道有没有说清楚。
2016-04-16 10:06
lyl930130
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:323
专家分:111
注 册:2013-5-13
收藏
得分:0 
找到了。
用getsockname就可以了
2016-04-17 00:42
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 
回复 5楼 lyl930130
你的算法是错的
accept返回的结果应该保存起来,你的却是一个局部临时对象
根本不需要将端口号发给对方

实际读多少,则发送多少
实际接收多少,则写多少
2016-04-18 12:53
lyl930130
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:323
专家分:111
注 册:2013-5-13
收藏
得分:0 
回复 7楼 rjsp
sock_tmp的问题:
之所以用sock_tmp,是因为这个socket建立起来只发送了服务器专门为客户端准备的端口,双方就结束了通信(双方都关闭了socket)。服务器关闭socket,等待下一个连接。这里在send()之后漏了closesocket(sock_tmp)

发送端口号发给对方问题:
我为每一个连接到服务器的客户端准备一个独立的端口,但是服务器创建这个端口是这么来的:htons(0)
您之前也说了,客户端用htons(0),因为connect会帮你找到源端口号,但是对服务器来说就不行,因为他是被连。所以我用getsockname()找出htons(0)对应的端口号,然后将其告诉客户端,知道了目标端口客户端才能connect。

send和recv问题:
知道了,会改正。
请教一下,recv这边,是用接收缓冲区的最大值吗?(char data[1024])

2016-04-18 17:04
lyl930130
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:323
专家分:111
注 册:2013-5-13
收藏
得分:0 
回复 7楼 rjsp
因为之前没接触过多线程/并行程序代码,自己闭门造车的东西,不对的地方还请版主多多指正
2016-04-19 16:09
快速回复:如何获得bing绑定端口的端口号
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.031412 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved