如何memcpy()结构sockaddr_in

anat0lius

我正在编写服务器-客户端程序。在服务器上,我通过以下数据结构数组管理客户端:

struct Client
{
    struct sockaddr_in addr;
    /*...*/
}; 

struct Client CLIENTS[MAX_CLI];

当我通过UDP套接字从客户端收到第一个数据包时

struct sockaddr_in addr_cli;

memset(&addr_cli,0,sizeof(struct sockaddr_in));
b=recvfrom(SOCK_UDP_FATHER, &pdu, sizeof(pdu), MSG_DONTWAIT,
    (struct sockaddr *)&addr_cli, (socklen_t *)&laddr_cli);

我想将他的地址复制到我的结构中。所以我做:

memcpy(&CLIENTS[client].addr,(struct sockaddr*)&addr_cli,
    sizeof(struct sockaddr_in));

printf("IP client: %s",inet_ntoa(CLIENTS[client].addr.sin_addr);

奇怪的是,第一次通信尝试失败,即打印0.0.0.0但是客户端所做的下一次尝试是成功的,并且一切顺利。为什么会这样?

Wojtek Surowka

addr_cli的呼叫未填补recvfrom的最后两个参数recvfrom有些棘手。他们是

struct sockaddr *src_addr,
socklen_t *addrlen

如果src_addr不为NULL,则recvfrom期望addrlen指向src_addr缓冲区的长度(通常是sockaddr结构的大小)。如果值addrlen太小,返回的地址将被截断。调用后recvfromaddrlen将设置为实际地址长度。文档的详细信息。

因此,您需要laddr_cli在调用之前进行初始化recvfrom()

struct sockaddr_in addr_cli;
socklen_t laddr_cli = sizeof(addr_cli); // <--

memset(&addr_cli,0,laddr_cli);    
b=recvfrom(SOCK_UDP_FATHER, &pdu, sizeof(pdu), MSG_DONTWAIT,
    (struct sockaddr *)&addr_cli, &laddr_cli);

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在C ++中使用静态sockaddr_in结构

来自分类Dev

是否有必要将“ sockaddr_in”结构归零?

来自分类Dev

sockaddr_in中需要单独的地址结构吗?

来自分类Dev

sockaddr_in中需要单独的地址结构吗?

来自分类Dev

插座。设置sockaddr_in结构的s_addr字段

来自分类Dev

如何初始化struct sockaddr_in的变量

来自分类Dev

sockaddr_in的作用是什么?

来自分类Dev

从sockaddr *强制转换为sockaddr_in *增加所需的对齐方式

来自分类Dev

如何从 SOCKADDR 结构中获取 IPv4 地址?

来自分类Dev

sockaddr,sockaddr_in和sockaddr_in6有什么区别?

来自分类Dev

为什么将sockaddr_in设置为0

来自分类Dev

没有匹配调用struct sockaddr_in

来自分类Dev

为什么在调用bind()时将sockaddr_in转换为sockaddr?

来自分类Dev

如何使用Memcpy初始化结构体中的数组

来自分类Dev

memcpy结构变量

来自分类Dev

sockaddr如何保存sockaddr_storage或sockaddr_in6?

来自分类Dev

sockaddr_in和sockaddr_in6仍在使用sin_len和sin6_len吗?

来自分类Dev

快速将NSData转换为sockaddr结构

来自分类Dev

为CocoaAsyncSocket创建sockaddr_in获取无效的IPv4地址

来自分类Dev

Delphi Winsock分配InAddr.S_addr时,为什么sockaddr_in值会出现“乱码”

来自分类Dev

UDP数据报中分配的端口号和sockaddr_in中的端口号

来自分类Dev

在XCode 6中找不到sockaddr_in(在OS X 10.10 Yosemite上)

来自分类Dev

如何在C中将u_int32_t IPv4地址分配给sockaddr_in的地址参数?(用C语言进行套接字编程)

来自分类Dev

c memcpy结构按值

来自分类Dev

memcpy 和共享内存结构

来自分类Dev

Cython如何使用Memcpy从numpy缓冲区复制到C结构?

来自分类Dev

Cython如何使用Memcpy从numpy缓冲区复制到C结构?

来自分类Dev

accept()调用不会初始化sockaddr结构

来自分类Dev

用于结构复制的memcpy和strncpy的区别

Related 相关文章

  1. 1

    在C ++中使用静态sockaddr_in结构

  2. 2

    是否有必要将“ sockaddr_in”结构归零?

  3. 3

    sockaddr_in中需要单独的地址结构吗?

  4. 4

    sockaddr_in中需要单独的地址结构吗?

  5. 5

    插座。设置sockaddr_in结构的s_addr字段

  6. 6

    如何初始化struct sockaddr_in的变量

  7. 7

    sockaddr_in的作用是什么?

  8. 8

    从sockaddr *强制转换为sockaddr_in *增加所需的对齐方式

  9. 9

    如何从 SOCKADDR 结构中获取 IPv4 地址?

  10. 10

    sockaddr,sockaddr_in和sockaddr_in6有什么区别?

  11. 11

    为什么将sockaddr_in设置为0

  12. 12

    没有匹配调用struct sockaddr_in

  13. 13

    为什么在调用bind()时将sockaddr_in转换为sockaddr?

  14. 14

    如何使用Memcpy初始化结构体中的数组

  15. 15

    memcpy结构变量

  16. 16

    sockaddr如何保存sockaddr_storage或sockaddr_in6?

  17. 17

    sockaddr_in和sockaddr_in6仍在使用sin_len和sin6_len吗?

  18. 18

    快速将NSData转换为sockaddr结构

  19. 19

    为CocoaAsyncSocket创建sockaddr_in获取无效的IPv4地址

  20. 20

    Delphi Winsock分配InAddr.S_addr时,为什么sockaddr_in值会出现“乱码”

  21. 21

    UDP数据报中分配的端口号和sockaddr_in中的端口号

  22. 22

    在XCode 6中找不到sockaddr_in(在OS X 10.10 Yosemite上)

  23. 23

    如何在C中将u_int32_t IPv4地址分配给sockaddr_in的地址参数?(用C语言进行套接字编程)

  24. 24

    c memcpy结构按值

  25. 25

    memcpy 和共享内存结构

  26. 26

    Cython如何使用Memcpy从numpy缓冲区复制到C结构?

  27. 27

    Cython如何使用Memcpy从numpy缓冲区复制到C结构?

  28. 28

    accept()调用不会初始化sockaddr结构

  29. 29

    用于结构复制的memcpy和strncpy的区别

热门标签

归档