2

例如,我想知道是否有任何显着差异或好的/坏的做法

这样做:

unsigned int length_addr; 
length_addr = sizeof(cli_addr);

nbytes = recvfrom(sockfd, buffer, sizeof(buffer), 0,
                  (struct sockaddr *)&cli_addr, &length_addr);

这样:

nbytes = recvfrom(sockfd, buffer, sizeof(buffer), 0,
                  (struct sockaddr *)&cli_addr, sizeof(cli_addr));
4

2 回答 2

2

是的,有很大的不同。

  • 对于第一种情况,您传递的是 an 的地址unsigned int,基本上是 an insigned int *

  • 在第二种情况下,您传递的sizeof是类型为 operator的结果size_t

他们不一样。

也就是说,根据手册页,基本上两者都不正确。最后一个参数应该是 type socklen_t *,所以你最好坚持使用正确的类型。

于 2016-10-30T23:35:02.947 回答
1

其实是有区别的。正如有人所说,传递地址(第一种情况)或(size_t)值(第二种情况)之间存在很大差异。如果您检查 recvfrom 手动参考,您可以看到最后一个参数是指向内存空间的指针,该内存空间的大小与前一个参数的 sockaddr 相同。

#include <sys/socket.h>

ssize_t recvfrom(int socket, void *buffer, size_t length, int flags,
         struct sockaddr *address, socklen_t *address_len);


/*address_len
Specifies the length of the sockaddr structure pointed to by the address argument.*/

第一个实际上是正确的,因为您向 lenght_addr 提供了 cli_addr 的大小,然后将指针作为参数传递。所以它应该可以正常工作。

于 2016-10-31T01:17:28.250 回答