有问题的代码来自这里(所以你可以看到完整的上下文):https ://www.anmolsarma.in/post/dccp/
在下面对 setsockopt 的调用中,有两部分我似乎无法找到相关信息,主要是因为我不知道要谷歌搜索什么,因为我不知道它叫什么。
&(int) {1},
和 :
&(int) {htonl(SERVICE_CODE)}
那么,{} 在这种情况下做了什么?我完全可以看到用普通括号来做,但我认为 {} 保留用于其他用途。
例如:
&(int)(htonl(SERVICE_CODE))
和上面的意思一样吗?我以前从未见过将类似的东西插入到函数调用中。我不确定它是 C 还是 C++,我怀疑只是 C(基于包含)。我想知道它是否与 htonl 有时是宏有时是函数有关,以及如何尝试在函数的参数列表中使用它可能会导致问题?这个结构叫什么(所以我可以用谷歌搜索并做更多的研究)?
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>
#include "dccp.h"
#define PORT 1337
#define SERVICE_CODE 42
int error_exit(const char *str)
{
perror(str);
exit(errno);
}
int main(int argc, char **argv)
{
int listen_sock = socket(AF_INET, SOCK_DCCP, IPPROTO_DCCP);
if (listen_sock < 0)
error_exit("socket");
struct sockaddr_in servaddr = {
.sin_family = AF_INET,
.sin_addr.s_addr = htonl(INADDR_ANY),
.sin_port = htons(PORT),
};
if (setsockopt(listen_sock, SOL_SOCKET, SO_REUSEADDR, &(int) {
1}, sizeof(int)))
error_exit("setsockopt(SO_REUSEADDR)");
if (bind(listen_sock, (struct sockaddr *)&servaddr, sizeof(servaddr)))
error_exit("bind");
// DCCP mandates the use of a 'Service Code' in addition the port
if (setsockopt(listen_sock, SOL_DCCP, DCCP_SOCKOPT_SERVICE, &(int) {
htonl(SERVICE_CODE)}, sizeof(int)))
error_exit("setsockopt(DCCP_SOCKOPT_SERVICE)");
...
}