c++ - 如何将 4 个字节复制到 sockaddr.sa_data?
问题描述
根据https://stackoverflow.com/a/5328190,我可以使用
std::string ip ="192.168.1.54";
std::stringstream s(ip);
int a,b,c,d; //to store the 4 ints
char ch; //to temporarily store the '.'
s >> a >> ch >> b >> ch >> c >> ch >> d;
std::cout << a << " " << b << " " << c << " "<< d;
将 IP 转换为其 4 个字节。Buw我怎么把它们放在里面
struct sockaddr
{
__SOCKADDR_COMMON (sa_); /* Common data: address family and length. */
char sa_data[14]; /* Address data. */
};
?
我应该只是简单地复制前 4 个字节中的 4 个字节sa_data
吗?
解决方案
您实际上并没有struct sockaddr
直接使用 a 。您将改为填充struct sockaddr_in
用于保存 IPv4 地址和端口的 a,然后将该结构的地址传递给期望 a 的函数struct sockaddr *
。
sockaddr_in
要从C 字符串填充 a 的地址字段,您可以使用inet_addr
.
例如:
struct sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = inet_addr(ip.c_str());
sin.sin_port = 0;
调用recvfrom
时,addrlen
参数应该是指向变量的指针,该变量设置为参数指向的结构的大小src_addr
。例如:
struct sockaddr_in peerAddr;
socklen_t len = sizeof(peerAddr);
recvfrom(sock, data, capacity, 0, (struct sockaddr *)&peerAddr, &len);
推荐阅读
- python - 如何通过 Selenium 和 Python 向 Instagram 中的用户名和密码字段发送文本
- python-3.x - Python 3 Tkinter 按钮命令不起作用(非常具体的场景)
- kotlin - 具有 Kotlin 依赖项的 OSGi 项目
- javascript - 如何在多个标签中使用类名添加 ID?
- swift - 状态栏中的自定义视图未在辅助屏幕上显示为禁用
- javascript - 使用js生成时出现div的文本
- json - Glue 的自定义 JSON 分类器读取架构但无法使用 Athena 读取数据
- sql - 创建不带光标的 ID 范围
- php - 你会如何在 Twig 的 {%%} 内做三元条件
- kubernetes - 在 kubernetes 中安装 heapster 或 metric 服务器以进行水平 pod 自动缩放