C语言网络编程
在C中用winsock2编程,有外网发来的数据,一定要先发到路由器的某个端口上,我的问题是如何从路由器上获取这些数据呢?可以通过某个地址上的套接字监听192.168.1....
在C中用winsock2编程,有外网发来的数据,一定要先发到路由器的某个端口上,我的问题是如何从路由器上获取这些数据呢?可以通过某个地址上的套接字监听192.168.1.1上的端口吗?如果能,这样能得到数据吗?还是要让路由器把收到的数据发到我的地址的端口上来呢,如果要这样,是要手动进行设置呢,还是可以在程序中与192.168.1.1进行沟通呢?(比如向路由器的某个端口发信息)
最后,路由器的端口是什么样的呢?
比如,我在路由器的内网中找到192.168.1.1的某个端口2014,和外界120.201.0.2的2014端口是一回事吗?
需要详解,相关的函数列出名字就可以了。 展开
最后,路由器的端口是什么样的呢?
比如,我在路由器的内网中找到192.168.1.1的某个端口2014,和外界120.201.0.2的2014端口是一回事吗?
需要详解,相关的函数列出名字就可以了。 展开
1个回答
展开全部
路由器本身不具备数据保存能力。
通常,路由器的功能是端口转发。在路由器建立端口映射(公网某端口和内网某台电脑的某端口关联)后,外网电脑才能和内网某电脑进行通信,通信过程中路由器一直负责数据的中转。但内网电脑一旦关闭连接,路由器是无法单独收取并保存信息的,它会直接把断连事件通知给连接的另一端(外网某电脑)。
例如你的情况,如果局域网里是作为服务器S(监听方),外网某电脑作为客户端C(连接方)。
S程序本身监听端口2014,而C要连接的是路由器在公网的12345端口。
设路由器在公网IP是123.124.125.126,S的内网IP是192.168.1.1。
这时需要对路由器进行手动配置,让路由器能将公网的12345端口和内网192.168.1.1这台电脑的2014映射关联。
这时,内网192.168.1.1上的S对2014进行监听(就用bind然后listen),路由器会反映到公网上,于是在公网看来,就是”电脑“123.124.125.126在对12345进行监听。
而如果外网连接123.124.125.126:12345(注意冒号),路由器会将这个连接请求转化成对192.168.1.1:2014(注意冒号)的连接请求,于是S就会收到连接,能用accept接受它。
后面都和局域网编程一样了。
有问题请继续追问。
通常,路由器的功能是端口转发。在路由器建立端口映射(公网某端口和内网某台电脑的某端口关联)后,外网电脑才能和内网某电脑进行通信,通信过程中路由器一直负责数据的中转。但内网电脑一旦关闭连接,路由器是无法单独收取并保存信息的,它会直接把断连事件通知给连接的另一端(外网某电脑)。
例如你的情况,如果局域网里是作为服务器S(监听方),外网某电脑作为客户端C(连接方)。
S程序本身监听端口2014,而C要连接的是路由器在公网的12345端口。
设路由器在公网IP是123.124.125.126,S的内网IP是192.168.1.1。
这时需要对路由器进行手动配置,让路由器能将公网的12345端口和内网192.168.1.1这台电脑的2014映射关联。
这时,内网192.168.1.1上的S对2014进行监听(就用bind然后listen),路由器会反映到公网上,于是在公网看来,就是”电脑“123.124.125.126在对12345进行监听。
而如果外网连接123.124.125.126:12345(注意冒号),路由器会将这个连接请求转化成对192.168.1.1:2014(注意冒号)的连接请求,于是S就会收到连接,能用accept接受它。
后面都和局域网编程一样了。
有问题请继续追问。
追问
感谢您的细致回答,但我还是有些问题。
想让路由器动态的转发一对端口可不可以用函数来完成或者用局域网向路由器发送信息来完成吗?
在没有端口映射的情况下,对外网的连接请求是不是会失败呢。
在有端口映射的情况下,如何知道我在外网的端口呢,这个值可不可以有意识的申请呢,在有链接的情况下,连接成功后,就向套接字发送数据即可,那么没有连接的(UDP)通信需不需要端口映射呢?
追答
抱歉一整天没上知道。
端口动态转发,这个要看路由器是否有这个机制了,我见过的几种路由器只能通过设置页面修改。也许有高端路由器给你配个WebService接口,这样就能动态修改映射关系了……
没有端口映射时,服务器的监听动作不会反映到外网,也就是说从外网看这个IP是没有在监听的,自然也无法连接。
在有端口映射的情况下,在外网的端口只有设置路由器的时候才能知道。UDP也是要端口映射的。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询