c - 如何在 C 中给客户端特定的 ip 地址

标签 c sockets client-server ip-address

我正在尝试用 C 语言实现一个简单的客户端和服务器,但我无法在网上找到如何为客户端设置特定 IP 地址的示例。这是我到目前为止得到的:

sockfd = socket(PF_INET, SOCK_STREAM, 0);
if (sockfd == -1)
{
    <some code to handle error>
}
address.sin_family = AF_INET;
address.sin_addr.s_addr = inet_addr(<addressOfTheServer>);
address.sin_port = htons(<portToConnectToServer>);
len = sizeof(address);

int result = connect(sockfd, (struct sockaddr *)&address, len);

在服务器端,我检查客户端 IP 地址,我总是得到 127.0.0.1

我想改变它一些不同的东西。

最佳答案

如果您希望您的客户端使用特定的网络接口(interface)进行连接(例如,因为您有多个网卡),那么您首先需要调用 bind(2)connecting 之前在该接口(interface)的 IP 地址上。例如,如果您有两个 IP 地址分别为 192.168.1.100 和 10.101.151.100 的网络接口(interface),那么要使用 192.168.1.100 地址进行连接,您可以这样做:

// Error checking omitted for expository purposes
int sockfd = socket(AF_INET, SOCK_STREAM, 0);

// Bind to a specific network interface (and optionally a specific local port)
struct sockaddr_in localaddr;
localaddr.sin_family = AF_INET;
localaddr.sin_addr.s_addr = inet_addr("192.168.1.100");
localaddr.sin_port = 0;  // Any local port will do
bind(sockfd, (struct sockaddr *)&localaddr, sizeof(localaddr));

// Connect to the remote server
struct sockaddr_in remoteaddr;
remoteaddr.sin_family = AF_INET;
remoteaddr.sin_addr.s_addr = inet_addr(server_ip);
remoteaddr.sin_port = htons(server_port);
connect(sockfd, (struct sockaddr *)&remoteaddr, sizeof(remoteaddr));

关于c - 如何在 C 中给客户端特定的 ip 地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15673846/

相关文章:

linux - 如何解决 "setsockopt(3, SOL_SOCKET, SO_MARK, [10], 4) = -1 EPERM"非 root 用户操作被拒绝

c - C 服务器通过互联网与 C# 对话的协议(protocol)是什么?

java - 如何在android上为服务器调度排队数据

Java:TCP套接字连接。客户端接收 null/readline() 返回 null

c - Strcat 在类似 getch 的简单密码输入上抛出段错误

CANopen/CAN总线,我需要什么,包括协议(protocol)(OD?),在PC终端和CAN设备模块之间进行通信

c++ - 客户端/服务器 C++ 之间的通信问题

python - 通过 Python 的编程 GDB 完成器接口(interface)

c - 这个 CRC6 片段给出了错误的结果

python - C和Python之间的套接字通信