PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Struktur fd_set unter Linux



Brillus
05-02-2004, 18:31
Also ich habe im Moment das Problem das eine Netzwerk-Klasse die ich für Windows mir erstellt habe auf Linux migrirern wollte und nun ist das problem das die Namen der Member wie sie unter Windows sind in Linux nicht erkannt werden und ich bis jetzt auch nicht rausbekommen habe wie die Member heissen.

PS: bin von linuxforen.de an euch verwiesen worden hoffe ihr könnt mir helfen.

anda_skoa
05-02-2004, 18:35
fd_set brauchst du normalerweise nicht direkt bearbeiten, sondern du benutzt Macros, die in der Manpage von select() beschrieben sind.

Eventuell ist poll() aber eine Überlegung wert, laut einem Freund von mir soll das wesentlich bessere Eigenschaften als select() haben.

Ciao,
_

Brillus
05-02-2004, 22:17
Hier mal ein Quellcodeauschnit von mir wobei fdSetRead die fd_set Struktur ist it ein itiator auf einen Vektor in den alle bekannten Clients stehen und M_client eben dieser Vektor. Hierbei wird dann die fd_set-Struktur benutz um
1. Die Daten den Benutzern zuzuorden und
2. als Quelle um zu erfahren welche Sockets man abfragen muss

Achso noch die Kompatibilitatät von Windows zu Linux z.B bei den Strukturnamen und befehlen wie closesocket -> close habe ich der #define gemacht falls es einen wundert. Der eizige fehler der imLinux noch auftritt ist halt das er die Member nicht erkennt.


rc= select(0, &fdSetRead,0,0,&timeout);
if(rc < 1) return Status;
for(int i = 0; i < fdSetRead.fd_count; ++i)
{
// Will ein Client dazukommen?
if(fdSetRead.fd_array[i] == s)
{
tCon.id=IDMax;
IDMax++;
Status[i].status=CONNECT;
int gross =sizeof(SOCKADDR_IN);
tCon.s=accept(s,(SOCKADDR*)&tCon.addr,&gross);
m_clients.push_back(&tCon);
continue;
}
for(it = m_clients.begin();((*it)->s != fdSetRead.fd_array[i])&&(it != m_clients.end());++it)
{
}
if ((*it)->s != fdSetRead.fd_array[i])
{
Error("Client nicht gefunden; das ist für Testzwecke");
continue;
}
char*buffer=new char[anzahl_bytes];
rc = recv(fdSetRead.fd_array[i],buffer,anzahl_bytes,0);
if(rc == SOCKET_ERROR)
{
Status[i].status=DISCONNECT;
Status[i].id=(*it)->id;
closesocket((*it)->s);
m_clients.erase(it);
delete buffer;
continue;
}
else if(strcmp(buffer,ExitMessage)==0)
{
Status[i].status=DISCONNECT;
Status[i].id=(*it)->id;
closesocket((*it)->s);
m_clients.erase(it);
delete buffer;
continue;
}
else
{
Status[i].status=MESSAGE;
Status[i].id=(*it)->id;
Status[i].byte_anzahl=rc;
Status[i].message=buffer;
}
}
return Status;

Edit hier noch die definiton der Struktur aus denen der Vektor besteht(sagt man das so?)bzw auf Zeiger auf solche Strukturen


typedef struct _Connection
{
int s;
sockaddr_in addr;
int id;
}Connection;

anda_skoa
07-02-2004, 17:51
Hmm.

Wie gesagt mach ich normalerweise keine low-level Sachen, bei Netzwerk ist auch die Frage, ob man da nicht eine Crossplatform Netzwerklib benutzt, die das schön abstrahiert.

Aber so weit ich dich verstanden hae, gehts dir um die Benutzung des fd_set Typs.
Der ist deklariert in types.h als ein typedef einer anderen struct. Die wiederum ist delariert in posix_types.h und zwar so



typedef struct {
unsigned long fds_bits [__FDSET_LONGS];
} __kernel_fd_set;


Ich würde sagen, einen POSIX fd_set Struktur hat genau ein Member, nämlich fds_bits.
Darum wird vermutlich auch immer mit den Macros FD_CLR, FD_ISSET , FD_SET und FD_ZERO gearbeitet.
Die Anzahl der FDs im Set gibt eh der Rückgabewert von select an, siehe auch
man 2 select

Ciao,
_

Brillus
07-02-2004, 20:21
Mal ein riesen großes danke.

Werde es sofort testen wenn ich wieder an meinen Rechner bin.