I/O Blocking mit UDP
-
Hi !
kann mir jemand sagen wie ich non-Blocking I/O mit udp verwirkliche?
Gebe zu ,die Frage ist sehr abstrakt gestellt, aber ich habe wirklich keine Ahnung.Besonders hilfreich wäre es: wenn mir jemand sagen könnte wie ich folgenden Code mit non Blocking I/O umsetze
int fd = socket( AF_INET, SOCK_DGRAM, 0 );
.
.addr.sin_family = AF_INET; // Protokoll Familie Ip Version 4 (32 Bit)
addr.sin_port = htons( 0 ); // Random port
addr.sin_addr.s_addr = htonl( INADDR_ANY ); // IP wird automatisch bestimmtint err = bind( fd, ( struct sockaddr* ) &addr, sizeof( struct sockaddr_in ) );
.
.
.while ( strcmp( msg.text,"exit" ) !=0 )
{
//---------------------------------------------------------------------
//---- ----
//---- EMPFANGS_TEIL ----
//---- ----
//---------------------------------------------------------------------
cout << "Empfangsbereit: " << endl;// empfangen eines UDP Datagrammes
int len = recvfrom( fd, &msg, sizeof(msg), 0, (struct sockaddr*) &from, &namelen );// Host bekommen // Unsicher ob folgende Zeile Notwendig?
phost = gethostbyaddr( &from.sin_addr,sizeof(from),AF_INET );// Anzahl der Nachrichten und die Nachricht ansich ausgeben
cout << msg.counter << "te" << "Empfangene Nachricht: ";
cout << msg.text << endl;
//---------------------------------------------------------------------
//---- ----
//---- SENDE_TEIL ----
//---- ----
//---------------------------------------------------------------------
/*if(msg.counter ==0)
cout << "Empfangsbereit: " << endl;// empfangen eines UDP Datagrammes
int len = recvfrom( fd, &msg, sizeof(msg), 0, (struct sockaddr*) &from, &namelen );// Host bekommen // Unsicher ob folgende Zeile Notwendig?
phost = gethostbyaddr( &from.sin_addr,sizeof(from),AF_INET );// Anzahl der Nachrichten und die Nachricht ansich ausgeben
cout << msg.counter << "te" << "Empfangene Nachricht: ";
cout << msg.text << endl;
}*/cout<<" Sende bereit: \n";
// die nachricht wird von Tastatur eingelesen
cin.getline( msg.text,64 );// senden eines UDP Datagrammes
/*int*/ len = sendto( fd, &msg, sizeof( msg ), 0, ( struct sockaddr* ) &from, sizeof( struct sockaddr_in ) );// Counter erhöhen
msg.counter++;} // Ende While
Dieses ist mein Code mit Blocking I O
NUN KOMMT MEIN VERSUCH MIT NON BLOCKING I/O (den Teil den ich mir überlegt habe, hab ich mit
Markiert)
p
int fd = socket( AF_INET, SOCK_DGRAM, 0 );//------------------------------------------------------------------------------
// BINDEN
//------------------------------------------------------------------------------addr.sin_family = AF_INET; // Protokoll Familie Ip Version 4 (32 Bit)
addr.sin_port = htons( 0 );
addr.sin_addr.s_addr = htonl( INADDR_ANY ); //
int flags;flags= fctnl(fd,F_GETEFL,0) //fcntl ist eine systemfunktion um den Socket in den non Blocking modus zu setzen
int err = fcntl(sockfd, F_SETFL, flags |O_NONBLOCK); // ??anstelle von bind( fd, ( struct sockaddr* ) &addr, sizeof( struct sockaddr_in ) );
// Auf Fehler überprüfen und bei Fehler Socket beenden
if ( err < 0 )
{// open if err
cout << "Close: " << close( fd ) << endl;
cerr << "Fehler beim Binden für UDP" << endl;
} //close if err// Socketlänge vom Typ socklen_t von addr in namelen abspeichern
socklen_t namelen = sizeof( addr );// eigener Port in tmpaddr
int sock = getsockname( fd,(sockaddr*) &tmpaddr, &namelen );//Probeweise ausgabe ob sich etwas verändert hat
// Eigenen Port mittels tmpaddr ausgeben
cout << "Eigener Port: " << ntohs( tmpaddr.sin_port ) << endl;while ( strcmp( msg.text,"exit" ) !=0 )
{
//---------------------------------------------------------------------
//---- ----
//---- EMPFANGS_TEIL ----
//---- ----
//---------------------------------------------------------------------
cout << "Empfangsbereit: " << endl;// empfangen eines UDP Datagrammes
int len = recvfrom( fd, &msg, sizeof(msg), 0, (struct sockaddr*) &from, &namelen );// Host bekommen
phost = gethostbyaddr( &from.sin_addr,sizeof(from),AF_INET );// Anzahl der Nachrichten und die Nachricht ansich ausgeben
cout << msg.counter << "te" << "Empfangene Nachricht: ";
cout << msg.text << endl;
//---------------------------------------------------------------------
//---- ----
//---- SENDE_TEIL ----
//---- ----
//---------------------------------------------------------------------cout<<" Sende bereit: \n";
// die nachricht wird von Tastatur eingelesen
cin.getline( msg.text,64 );if ( len = recvfrom(STDIN_FILENO,&msg, sizeof(msg), 0, (struct sockaddr*) &dest,&namelen )< 0)
{
if(errno != EWOULDBLOCK)
printf("ES IST EIN FEHLER AUFGETRETEN \n");
else
{
len = sendto( fd, &msg, sizeof( msg ), 0, ( struct sockaddr* ) &dest, sizeof( struct sockaddr_in ) );
if (len < sizeof(msg))
printf("FEHLER NACHRICHT KONNTE NICHT GESENDET WERDEN\n");
}
}
// senden eines UDP Datagrammes
/*int*/ len = sendto( fd, &msg, sizeof( msg ), 0, ( struct sockaddr* ) &from, sizeof( struct sockaddr_in ) );// Counter erhöhen
msg.counter++;} // Ende While
Schon mal vielen Dank im Voraus(besonders für die die das bis hier hin gelenen haben
)
Gruß Michael
-
Bist neu hier, deswegen gleich mal ein paar Infos:
1. Bitte Posting nochmal editieren und rund um deinen Cpp-Code
und abschließend
machen. Dann wird der schön formatiert, so liest das kein Schwein
2. Du bist im falschen Forum gelandet. Mit Webzeugs ist nicht das Benützen von Netzwerk-Libraries unter C++ gedacht sondern mehr HTML, PHP, etc.
So sobald der Code formatiert ist kann man den dann auch angehen
MfG SideWinder