端口监听?

yayamao 2011-01-12 03:22:36
我的电脑在公司的路由器端设置了一个开放的端口,通过TCP/UDP测试工具和外网连接测试OK,但是换成是我自己写的程序作为服务器端,用TCP/UDO测试工具作为客户端,就有时可以连接,有时无法连接,这是怎么回事呢?
...全文
270 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
yayamao 2011-01-14
  • 打赏
  • 举报
回复
已经有办法了,因为GPRS DTU在连接上服务器以后会发一包注册包,我可以提取里面的信息,作为这个客户端的Socket ID,而且这个信息是固定的,所以可以在这边数据库中利用此信息作为查询的条件。
yayamao 2011-01-13
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 varding 的回复:]
知道每个gprs的ip以及他所在的位置,accept后根据socket来用getpeername得到目标ip
[/Quote]

这个不行,不管是哪个GPRS模块,从我这边得到的getPeername都是网关的地址
虎皮青椒 2011-01-13
  • 打赏
  • 举报
回复
有的时候时间太快了,也是不行。
HuWenjin 2011-01-13
  • 打赏
  • 举报
回复
SOCKET 打开时绑定的IP要是能出公网的那个网卡的IP,不能用IFNET吧(不能自动选)

关键:创建SOCKET时必须绑定到能出公网的IP。
varding 2011-01-13
  • 打赏
  • 举报
回复
知道每个gprs的ip以及他所在的位置,accept后根据socket来用getpeername得到目标ip
yayamao 2011-01-13
  • 打赏
  • 举报
回复
现在又多出了一个问题,我的客户端都是GPRS DTU,我需要在accept的时候清楚的区分这些GPRS,因为每个GPRS都安装在一个特定的地方,我需要收到消息的时候就能判断出这个GPRS在哪个地方,如果不在通信协议里附加这些信息,我该怎么做呢?
yayamao 2011-01-13
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 the_venus 的回复:]
请你先理解一下Listen()函数的参数,
windows API中的listen()带有两个参数的,第二个参数是一个整形的,表示当连接该socket 的 socket的数量超过该值(将已经调用了accept()函数处理掉的除外)时,连接就会失败。
你可以看看unix 网络编程这本书,虽然这本书讲的是在unix下的,但有好多的东西在windows下面也一样适用的。
[/Quote]
lijianli9 2011-01-13
  • 打赏
  • 举报
回复
通过协议转发地址。
the_venus 2011-01-12
  • 打赏
  • 举报
回复
请你先理解一下Listen()函数的参数,
windows API中的listen()带有两个参数的,第二个参数是一个整形的,表示当连接该socket 的 socket的数量超过该值(将已经调用了accept()函数处理掉的除外)时,连接就会失败。
你可以看看unix 网络编程这本书,虽然这本书讲的是在unix下的,但有好多的东西在windows下面也一样适用的。
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 yayamao 的回复:]
用netstat看了下,会不会是用TCP测试工具创建的连接还没有在网关那边关掉呢,显示是CLOSE_WAIT状态
[/Quote]

====================
试一下
yayamao 2011-01-12
  • 打赏
  • 举报
回复
但是即使这样,我用GPRS DTU作为客户端,没有办法连接上。

而且,我的客户端都是GPRS DTU,连接到我这边以后,我用什么方式可以把它们区分开呢,本来用的是GetPeerName来获得对方的IP,但现在对方的IP全都是我这边网关的IP啊
yayamao 2011-01-12
  • 打赏
  • 举报
回复
用netstat看了下,会不会是用TCP测试工具创建的连接还没有在网关那边关掉呢,显示是CLOSE_WAIT状态
yayamao 2011-01-12
  • 打赏
  • 举报
回复
用TCP测试工具在我的主机和外网的一个主机测过,没有问题的
Eleven 2011-01-12
  • 打赏
  • 举报
回复
测试都在内网?
yayamao 2011-01-12
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 mayudong1 的回复:]
单纯的一个listen,如果不进行accept的话,当连接超过listen里设置的数量后就不能再连了
[/Quote]

我是一个CListeningSocket从CSocket继承来的,重载了Accpet
yayamao 2011-01-12
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 varding 的回复:]
CListeningSocket是不是从CSocket继承来的?

服务器最好不要Create,看看这个:
http://www.cnblogs.com/yejiansnake/archive/2008/10/27/SOCKET.html
[/Quote]

是的
mayudong1 2011-01-12
  • 打赏
  • 举报
回复
单纯的一个listen,如果不进行accept的话,当连接超过listen里设置的数量后就不能再连了
varding 2011-01-12
  • 打赏
  • 举报
回复
CListeningSocket是不是从CSocket继承来的?

服务器最好不要Create,看看这个:
http://www.cnblogs.com/yejiansnake/archive/2008/10/27/SOCKET.html
yayamao 2011-01-12
  • 打赏
  • 举报
回复
用的是CSocket做的,监听函数:
m_pSocket=new CListeningSocket(this);
m_Port=atoi(*port);
if(m_pSocket->Create(m_Port))
{
if(m_pSocket->Listen())
}
这样做有问题吗?

18,356

社区成员

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

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