?
Ich habe noch ein kleines Problem...
Ich habe einen kleinen Server, der Verbindungen annimt und in eine Liste schiebt. Wobei die Socketdeskriptoren in eine intliste und die Adresstrukturen in eine andere kommen.
danach forke ich...
sockaddr_in clientAddr;
socklen_t addr_len = sizeof(clientAddr);
int client_socket;
/*
Horche in dieser Schleife, ob evtl. Anfragen von Außen kommen.
Falls sich ein Client verbindet wird gethreadet und die Anfrage bearbeitet
*/
while(true) {
client_socket = accept(m_iSocket, (struct sockaddr*) &clientAddr, &addr_len);
if (client_socket == -1) {
/* bei nicht automatisch neustartenden Systemcalls
* if (errno == EINTR)
* ...
*/
perror("accept() failed");
continue;
}
/*
Merke den verbundenen Client
*/
m_lAdresses.push_back(clientAddr);
m_lClients.push_back(client_socket);
/*
Arbeite alle verbundenen Clients ab
*/
int socket;
for(unsigned int i = 0; i < m_lAdresses.size(); i++) {
// socket = m_lSockets.at(i);
#ifndef WIN32
pid_t pid;
pid = fork();
if(pid == 0) {
exit(handleClient(m_lClients.at(i) ) );
printf("Client has PID %i\n", pid);
}
else if(pid < 0) {
perror("fork() failed");
return -1;
}
#endif
Nun möchte ich, im Falle das mehrere Clients verbunden sind untereinander Nachrichten austauschen.
Wenn nun über einen Client eine Nachricht wie: send IP PORT TEXT( "send 127.0.0.1 12345 Hallo" ) gesendet wird, dann soll erst überprüft werden, ob der Server diesen Client grade verwaltet und falls das der Fall ist, die nachricht Hallo an diesen senden.
if(section(str, ' ', 0, 0) == "send") {
for(int i = 0; i < m_lAdresses.size(); i++) {
sockaddr_in clientAddr = m_lAdresses.at(i);
/*
Vergleiche ob IP (und Port) schon mit Server verbunden sind
und sende dann eine Nachricht an das Ziel
*/
int iPort = atoi(section(str, ' ', 2, 2).c_str() );
if(inet_ntoa(clientAddr.sin_addr) == section(str, ' ', 1, 1) && htons(clientAddr.sin_port) == iPort) {
cout<<"send message to: "<<inet_ntoa(clientAddr.sin_addr)<<"; "<<iPort<<endl;
char cstr[str.size()+1];
strcpy (cstr, section(str, ' ', 3, 3).c_str() );
// redirectDataTo(inet_ntoa(clientAddr.sin_addr), iPort, cstr, str.size()+1);
if(sendto(m_lClients.at(i), cstr, strlen(cstr), 0, (struct sockaddr*) &clientAddr, sizeof(clientAddr)) == -1) {
perror("sendto() in sendData() failed");
return -1;
}
}
}
Bei mir ist der Fehler aufgetreten, dass er erfolgreich sucht und den entsprechenden Client findet. Dann wird die Nachricht über sendto gesendet, aber anstatt den richtigen Client zu besenden, wird wieder an den Ausgangspunkt übermittelt.
Ich habe die Vermutung, dass es evtl etwas mit dem Client-Socket zu tun hat, weil das bei mir immer 5 ist. Dadurch kann er vlt. nicht unterscheiden. Aber andererseits sind die Daten in der Adressstruktur eindeutig. Ich bin neu in diesem Themengebiet, aber ich versteh nicht warum der Server wieder zurücksendet. Und warum bei jedem Accept() das clientsocket gleich ist. ich dachte das müsste einzigartig sein.