我想知道…如果你创建一个函数,它有一个简单的套接字参数,你做你的基本指令内部的函数,如设置不同的选项套接字(setsockopt()
)和函数存在后,它将保持选项的实际区别是什么?或者我应该让这个参数指针指向那个套接字,以便保存将发生在套接字上的实际变化。
sctp_enable_events( int socket, int ev_mask )
{
struct sctp_event_subscribe ev;
bzero(&ev, sizeof(ev));
if (ev_mask & SCTP_SNDRCV_INFO_EV)
ev.sctp_data_io_event = 1;
/*code */
if (setsockopt(socket,
IPPROTO_SCTP,
SCTP_EVENTS,
SCTP_SET_EVENTS,
(const char*)&ev,
sizeof(ev)) != 0 ) {
fprintf(where,
"sctp_enable_event: could not set sctp events errno %dn",
errno);
fflush(where);
exit(1);
}
}
还是这样?
sctp_enable_events( int *socket, int ev_mask, struct sctp_event_subscribe *ev )
{
if (ev_mask & SCTP_SNDRCV_INFO_EV)
ev->sctp_data_io_event = 1;
/*code */
if (setsockopt(*socket,
IPPROTO_SCTP,
SCTP_EVENTS,
SCTP_SET_EVENTS,
ev,
sizeof(*ev)) != 0 ) {
fprintf(where,
"sctp_enable_event: could not set sctp events errno %dn",
errno);
fflush(where);
exit(1);
}
}
我知道通过传递指针到struct,int,char等,你可以在函数执行后修改值,没有指针的修改将只在该函数中保持局部,但它不会改变全局。
但是setsockopt
函数呢?
setsockopt
函数无法告诉您如何提出它的参数。因此,它不能采取不同的行动。无论你写:
f(1);
或
int x = 1;
int* xPtr = &x;
f(*xPtr);
不能被f检测到。
这个问题真的与setsockopt
无关。我建议你加强关于指针和值的C知识。如果没有这种理解,你会在c语言中犯很多错误。
通常应该将指针传递给结构体,因为效率高,而且您可能希望在不同的上下文中使用这些结构体(通过解引用指针)。
对于setsockopt()
的socket
参数,它是一个int
,所以它足够小,可以通过值传递(而且setsockopt()
函数的签名需要一个int
,而不是一个指针)。
对于setsockopt()
和其他C系统API函数,您应该查找它的声明/原型,并提供与原型要求的类型完全相同的参数(必要时进行强制转换)。
对于setsockopt()
,它将是:
int `setsockopt()` setsockopt(int sockfd, int level, int optname,
const void *optval, socklen_t optlen);