用C语言实现局域网外Socket编程

用C语言实现局域网外Socket编程,c,sockets,networking,C,Sockets,Networking,我想通过网络向特定目标(笔记本电脑)发送数据,因此我有目标的公共IP,例如适配器的2.133.167.57私有IP:192.168.1.1和MAC:CC:AB:C2:18:72:63,并且特定目标正在监听我的连接; 据我所知,我们需要连接到特定目标的是公共IP、私有IP(可能)、MACAddress 我用我的笔记本电脑和电话在检查了我的公共IP地址,这两个地址应该是一样的(因为我没有为他们使用VPN服务)。 让我们来看看StultSokAdDrILin: struct sockaddr_in {

我想通过网络向特定目标(笔记本电脑)发送数据,因此我有目标的公共IP,例如适配器的2.133.167.57私有IP:192.168.1.1和MAC:CC:AB:C2:18:72:63,并且特定目标正在监听我的连接; 据我所知,我们需要连接到特定目标的是公共IP、私有IP(可能)、MACAddress

我用我的笔记本电脑和电话在检查了我的公共IP地址,这两个地址应该是一样的(因为我没有为他们使用VPN服务)。 让我们来看看StultSokAdDrILin:

struct sockaddr_in {
    sin_family;
    sin_port;
    sin_addr;
}
<我的目标连接到的调制解调器有一个公共IP,它们是很少使用这个公共IP的设备(让我们考虑他们不使用VPN),所以如果我只输入目标的公共IP在SnIdAdDR中,它将不被发送到我的目标,所以现在我必须添加MAC地址或适配器的私有IP,使连接更准确,但是如何?

除了公共IP、MAC或私有IP之外,我如何添加

我应该使用哪个函数或结构在不同网络上的两台笔记本电脑之间建立连接

据我所知,连接到特定目标需要的是公共IP、私有IP(可能)、MACAddress

不需要。如果要建立TCP连接,只需要一个IP地址和端口号。无论如何,您无法在
connect
呼叫中直接提供辅助(专用)IP或mac地址


但您必须确保拥有公共IP地址的设备知道如何处理您的传入连接。当公共IP地址和私有IP地址之间存在差异时,通常意味着您有一种网关提供网络地址转换(Internet提供商框通常会这样做)。它通过将原始IP地址替换为自己的IP地址,并将响应传回原始计算机,自动处理传出连接。但对于传入连接,必须明确指示它将调用传递到特定端口到特定机器,因为默认情况下,它通常会拒绝所有操作。

您尝试执行的操作将不起作用。您需要在NAT中设置端口转发。这似乎是一个一般的计算问题。这不可能仅仅在短期内就得到解决C@tkausl谢谢,伙计。这帮了大忙,但有一个问题:为什么两台笔记本电脑之间的连接需要端口转发,而与服务器的连接我们不使用端口转发?因为路由器不支持NAT。您的家庭网络共享一个且仅一个公共IP地址,通过路由器(NAT)访问,服务器有自己的公共IP,并直接连接到internet。为了澄清,“明确指示将呼叫传递到特定端口到特定机器”通常意味着网关设备的所有者必须登录到网关设备的设置GUI,并手动设置指定端口的端口转发(即,通常不能通过编程完成)