我知道这不是出现此错误的第一个线程,但是我真的无法理解是什么错误...我的代码在下面:
\v
我正在通过指针传递结构,因此我必须使用/* File descriptor sets */
struct descs {
fd_set read;
fd_set write;
fd_set except;
};
typedef struct descs descs_t;
/* Server representation */
struct server {
int sock; /* Server sock descriptor */
struct sockaddr_in addr; /* Server address */
socklen_t addrlen; /* Server address size */
char buffer[BUFFER_SIZE]; /* Message buffer */
int len; /* Message buffer length */
};
typedef struct server server_t;
void build_fds(struct server *srv, struct descs *fd) {
FD_ZERO(fd->read);
FD_SET(STDIN_FILENO, fd->read);
FD_SET(srv->sock, fd->read);
FD_ZERO(fd->write);
// there is smth to send, set up write_fd for server socket
if (srv->len > 0) {
FD_SET(srv->sock, fd->write);
}
FD_ZERO(fd->except);
FD_SET(STDIN_FILENO, fd->except);
FD_SET(srv->sock, fd->except);
}
,但是它因错误而崩溃:
->
我的代码有什么问题?
答案 0 :(得分:3)
您缺少&
,即您需要数据结构的地址,例如
#include <sys/select.h>
struct descs {
fd_set a;
};
void func(struct descs *d) {
FD_ZERO(&d->a);
}
答案 1 :(得分:2)
从man select的FD_ *宏中获取指向fd_set
的指针:
void FD_CLR(int fd, fd_set *set);
int FD_ISSET(int fd, fd_set *set);
void FD_SET(int fd, fd_set *set);
void FD_ZERO(fd_set *set);
您应该将指针传递给函数(宏),而不是值。您可以使用address-of运算符:
FD_ZERO(&fd->read);
FD_SET(STDIN_FILENO, &fd->read);
FD_SET(srv->sock, &fd->read);
以此类推。