我碰到一個比較奇怪的問題:段錯誤的FD_ISSET
我用select()
,以確定是否套接字變得可讀。但是,每當客戶端連接時,我會調用FD_ISSET()
來檢查給定套接字是否存在於fd_set
中,我會遇到段錯誤。
/* [...] */
while(/* condition */){
timeout.tv_sec = 0;
timeout.tv_usec = SELECT_TIMEOUT;
//this simply fills sockets with some file descriptors (passed in by clients - both parameters are passed by reference)
maxfd = this->build_fd_set(clients, sockets);
//wait until something relevant happens
readableCount = select(maxfd + 1, &sockets, (fd_set*)NULL, (fd_set*)NULL, &timeout);
if(readableCount > 0){
//Some sockets have become readable
printf("\nreadable: %d, sockfd: %d, maxfd: %d\n",
readableCount, this->sockfd, maxfd);
//Check if listening socket has pending connections
// SEGFAULT OCCURS HERE
if(FD_ISSET(this->sockfd, &sockets)) {
DBG printf("new connection incoming");
this->handle_new_connection(clients);
/* [...] */
}else {
// Data is pending on some socket
/* [...] */
}
}else if(readableCount < 0) {
//An error occured
/* [...] */
return;
}else {
// select has timed out
/* [...] */
}
}
編輯: 呀,比較遺憾的是稀疏的信息:我已經更新了代碼。
this->sock_fd
被設置爲監聽套接字的描述符,使用this->sockfd = socket(AF_UNIX, SOCK_STREAM, 0);
創建,然後通過listen(this->sockfd, ACCEPT_BACKLOG)
進行監聽。
build_fd_set:
int SvcServer::build_fd_set(const vector<int>& clients, fd_set& sockets) {
//build up the socket set
FD_ZERO(&sockets);
FD_SET(this->sockfd, &sockets); //listening socket is always part of the set
int maxfd = this->sockfd;
//Add all currently connected sockets to the list
for(vector<int>::const_iterator it = clients.begin() ; it != clients.end() ; ++it) {
FD_SET(*it, &sockets);
maxfd = max(maxfd, *it);
}
return maxfd;
}
這真的什麼並不重要clients
是,這只是空的,意味着一旦客戶端連接到被填充,自第一次進來的連接整個事情的段錯誤沒有發生。
而且,這裏的一些示例輸出:
readable: 1, sockfd: 3, maxfd: 3
Segmentation fault
我可以在這裏得到的東西:
- 的調用
select()
作品,readable
設置正確 - 也
sockfd
和maxfd
是有效的描述符。
恐怕我無法爲您提供任何調試信息(例如gdb),因爲我正在進行交叉編譯,並且gdb在編譯的平臺上不可用。
什麼是'build_fd_set'方法?和'套接字'聲明/初始化在哪裏? – Random832
這個 - > sockfd會發生什麼? –
什麼是套接字?你如何初始化它? –