本地套接字选项集与指向套接字选项集的指针
Local socket option set vs pointer to socket option set
我想知道...如果您创建一个具有简单套接字参数的函数并在该函数中执行基本指令,例如为该套接字设置不同的选项 (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 %d\n",
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 %d\n",
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
,所以它足够小,可以按值传递(也是[的签名] =12=] 函数需要 int
,而不是指针)。
至于 setsockopt()
和其他 C 系统 API 函数,你应该查找它的 declarations/prototypes 并提供与原型要求完全相同类型的参数(如果必要的)。
在 setsockopt()
的情况下,它将是:
int `setsockopt()` setsockopt(int sockfd, int level, int optname,
const void *optval, socklen_t optlen);
我想知道...如果您创建一个具有简单套接字参数的函数并在该函数中执行基本指令,例如为该套接字设置不同的选项 (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 %d\n",
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 %d\n",
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
,所以它足够小,可以按值传递(也是[的签名] =12=] 函数需要 int
,而不是指针)。
至于 setsockopt()
和其他 C 系统 API 函数,你应该查找它的 declarations/prototypes 并提供与原型要求完全相同类型的参数(如果必要的)。
在 setsockopt()
的情况下,它将是:
int `setsockopt()` setsockopt(int sockfd, int level, int optname,
const void *optval, socklen_t optlen);