-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathnetcommon.cpp
More file actions
90 lines (80 loc) · 3.57 KB
/
netcommon.cpp
File metadata and controls
90 lines (80 loc) · 3.57 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
/******************************************************************************
* $Revision$ *
* *
* Copyright (C) 2007 Ignasi Barri Vilardell *
* Copyright (C) 2007 Alberto Montañola Lacort *
* Copyright (C) 2007 Josep Rius Torrento *
* See the file AUTHORS for more info *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the Free Software *
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA *
* 02110-1301,USA. *
* *
* Please see the file COPYING for the full license. *
* *
*******************************************************************************
* *
* Xarxes II *
* Màster en Enginyeria de Programari Lliure *
* *
* Pràctica I *
* *
******************************************************************************/
#include <iostream>
#include <queue>
#include <errno.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#include "protocol.h"
#include "netcommon.h"
extern bool _debug;
selectInterface::selectInterface() {
FD_ZERO(&_readfs);
FD_ZERO(&_master);
_fdmax=0;
}
void selectInterface::register2(int fdesc) {
if(_debug) printf("registe: %i\n",fdesc);
FD_SET(fdesc,&_master);
_fdmax = fdesc>_fdmax ? fdesc : _fdmax;
}
void selectInterface::unregister(int fdesc) {
FD_CLR(fdesc,&_master);
if(_fdmax == fdesc) {
int i;
for(i=fdesc-1; i>3; i--) {
if(FD_ISSET(i,&_master)) {
_fdmax=i;
break;
}
}
}
}
std::queue<int> & selectInterface::wait() {
while(!_descs.empty()) _descs.pop();
_readfs = _master;
if(select(_fdmax+1,&_readfs,NULL,NULL,NULL) == -1) {
if(errno==EINTR) return _descs; //A signal was cauch
throw errorException("select");
}
int i;
for(i=0; i<=_fdmax; i++) {
if(FD_ISSET(i,&_readfs)) {
_descs.push(i);
//printf("%i", i);
}
}
return _descs;
}