PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : c++ netzwerkprogrammierung select



barton4
15-09-2006, 17:12
Ich will die netzwerkprogrammierung so gestallten das der server nicht immer bei
m accept stehenbleibt und wartet.

Nun gibt es fcntl und slelect.
Weis einer wo es dazu gute anleitung gibt und gut verständlcihe Bspiele...

SeeksTheMoon
15-09-2006, 22:04
Was für eine Bibliothek benutzt Du da eigentlich?

barton4
16-09-2006, 09:51
ich benutz ddie normalen includes für unix

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

Gsus
16-09-2006, 14:05
Hi

gibt es eigentlich noch spezille C++ libs für Netzwerk Programmierung ??

mfg

gsus

locus vivendi
16-09-2006, 14:45
gibt es eigentlich noch spezille C++ libs für Netzwerk Programmierung ??
Einige:

http://www.cs.wustl.edu/~schmidt/ACE.html
http://asio.sourceforge.net/
http://doc.trolltech.com/4.1/qtnetwork.html
http://www.msobczak.com/prog/bin/sockets.zip
http://www.appinf.com/poco/info/index.html
http://libassa.sourceforge.net/
http://forgeftp.novell.com//blocxx/doc/html/class_b_l_o_c_x_x___n_a_m_e_s_p_a_c_e_1_1_socket.h tml
http://www.alhem.net/Sockets/

http://www.elcel.com/products/opentop/index.html
http://www.roguewave.com/products/sourcepro/SourceProNet.pdf

Und sicher noch weitere. In der Liste sind alle bis auf die beiden unteren übrigens Freie Software.

RapidMax
16-09-2006, 15:31
Je nach Anwendung reicht es mit fcntl() den Socket mit O_NONBLOCK auszustatten, dann kommt der accept() sofort wieder -EAGAIN zurück, wenn nichts ansteht. Wenn du das in einen Loop verpackst, dann nennt man das pollen, was sicherlich nicht besonders effizient ist.

Und hier kommt select() ins Spiel, dass dir erlaubt, ein oder mehrere Filedescriptoren auf anstehende Anfragen zu überprüfen und gegebenfalls auch noch einen Timeout anzugeben, nach dem select() auf jedenfall zurückkehrt.

Gerade zum lernen ist es sicherlich nicht schlecht, einmal mit dem rohen socket-API umzugehen. Falls du damit ein bisschen Spielen willst, könntest du das socket-Modul in Python verwenden, das sich genau auf das C-API abbildet, aber wesentlich einfach in der interaktiven Konsole zum experimentieren eignet.

Oft, gerade bei umfangreicheren Anwendungen, lohnt es sich durchaus, eine bestehende Bibliothek zu verwenden.

Gruss, Andy

barton4
16-09-2006, 16:19
@RapidMax genau das denk ich auch, erstmal mit der rohen API

barton4
17-09-2006, 20:49
hier ist einBSp... was mehrer telnet clients zulassen soll und wenn ein client etwas versendet soll es auf den anderen erscheinen, keider funktioniert das nicht, man kann sich zwar mit telnet verbinden aber versendet wird nichts

#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <unistd.h>
#include <fcntl.h>
#include <iostream>
using namespace std;
#define PORT 1222

int main()
{

int s, s2;
sockaddr_in my, remove;
int smax;
fd_set master;
char buffer[]="Anfangstext";
socklen_t size = 0;

my.sin_family = AF_INET;
my.sin_port = htons(PORT);
my.sin_addr.s_addr= INADDR_ANY;
memset(my.sin_zero, 0, 8);


int yes=1;
s = socket(AF_INET, SOCK_STREAM, 0);
setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int));
bind(s, (sockaddr *)&my, sizeof(my));
FD_ZERO(&master);
FD_SET(s, &master);
smax=s;
if( listen(s, 20)==-1)
{
cout<<"error: listen"<<endl;
}

while(true)
{
cout<<"-"<<endl;
if( select(smax+1, &master, NULL, NULL, NULL) == -1 )
{
cout<<"error: select"<<endl;
exit(1);
}
for(int i=0; i<=smax; i++)
{
cout<<"i:"<<i;
if(i!=s)
{
size=sizeof(sockaddr);
s2=accept(s, (sockaddr *)&remove, &size);
if(s2>0)
{
FD_SET(s2, &master);
if(s2>smax){smax=s2;}
}
if (FD_ISSET(i, &master))
{
send(i, buffer, strlen(buffer), 0);
}
}
}
for(int i=0; i<=smax;i++)
{
if(s!=i || FD_ISSET(i, &master))
{
recv(i, buffer, strlen(buffer), 0);
}
}
}


}

7.e.Q
21-09-2006, 11:54
http://beej.us/guide/bgnet/

barton4
22-09-2006, 07:44
http://beej.us/guide/bgnet/ probiert

von dieser Seite hab ich den Code, hab in aber nicht abgeschrieben sondern versucht
selber noch mal beu zu schreiben, zum verständnis halber...

7.e.Q
22-09-2006, 08:24
Ist meiner Meinung nach für die Standard-Netzwerk-Entwicklung unter Linux das beste Tutorial im Netz.

Die ist auch noch gut: http://www.zotteljedi.de/doc/socket-tipps/