Hallo ihr Lieben,
meiner erster Post, juhuuu :D.
Ich habe eine Projekt in der Uni am laufen, bei dem ich einen Socketserver aufsetzten soll. Dieser soll Systemdaten dann in Protokollen schreiben. Die Systemdaten sollen von verschiedenen Rechnern immer auf denb Socket geschickt werden. Nun gut, ich habe mal damit begonnen, einen simplen Socketserver aufzusetzten. Dieser kann bis jetzt nur einfache Verbindungen. Erst später werde ich durch Threading mehrere Clients möglich machen. Da man ja in der Informatik das Rad nie neu erfinden soll, habe ich mich bei dem Grundserver auf dieses Tutorial hier gestützt (Server und Client sollen in C++ programmiert werden).
Server:
#include <iostream>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <unistd.h>
using namespace std;
int main()
{
/* ---------- INITIALIZING VARIABLES ---------- */
int client, server;
int portNum = 1500;
bool isExit = false;
int bufsize = 1024;
char buffer[bufsize];
struct sockaddr_in server_addr;
socklen_t size;
/* ---------- ESTABLISHING SOCKET CONNECTION ----------*/
/* --------------- socket() function ------------------*/
client = socket(AF_INET, SOCK_STREAM, 0);
if (client < 0)
{
cout << "\nError establishing socket..." << endl;
exit(1);
}
cout << "\n=> Socket server has been created..." << endl;
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htons(INADDR_ANY);
server_addr.sin_port = htons(portNum);
/* ---------- BINDING THE SOCKET ---------- */
/* ---------------- bind() ---------------- */
if ((bind(client, (struct sockaddr*)&server_addr,sizeof(server_addr))) < 0)
{
cout << "=> Error binding connection, the socket has already been established..." << endl;
return -1;
}
size = sizeof(server_addr);
cout << "=> Looking for clients..." << endl;
/* ------------- LISTENING CALL ------------- */
/* ---------------- listen() ---------------- */
listen(client, 1);
/* ------------- ACCEPTING CLIENTS ------------- */
/* ----------------- listen() ------------------- */
int clientCount = 1;
server = accept(client,(struct sockaddr *)&server_addr,&size);
// first check if it is valid or not
if (server < 0)
cout << "=> Error on accepting..." << endl;
while (server > 0)
{
strcpy(buffer, "=> Server connected...\n");
send(server, buffer, bufsize, 0);
cout << "=> Connected with the client #" << clientCount << ", you are good to go..." << endl;
cout << "\n=> Enter # to end the connection\n" << endl;
cout << "Client: ";
do {
recv(server, buffer, bufsize, 0);
cout << buffer << " ";
if (*buffer == '#') {
*buffer = '*';
isExit = true;
}
} while (*buffer != '*');
do {
cout << "\nServer: ";
do {
cin >> buffer;
send(server, buffer, bufsize, 0);
if (*buffer == '#') {
send(server, buffer, bufsize, 0);
*buffer = '*';
isExit = true;
}
} while (*buffer != '*');
cout << "Client: ";
do {
recv(server, buffer, bufsize, 0);
cout << buffer << " ";
if (*buffer == '#') {
*buffer == '*';
isExit = true;
}
} while (*buffer != '*');
} while (!isExit);
/* ---------------- CLOSE CALL ------------- */
/* ----------------- close() --------------- */
cout << "\n\n=> Connection terminated with IP " << inet_ntoa(server_addr.sin_addr);
close(server);
cout << "\nGoodbye..." << endl;
isExit = false;
exit(1);
}
close(client);
return 0;
}
Alles anzeigen
Client:
#include <iostream>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <unistd.h>
#include <netdb.h>
using namespace std;
int main()
{
/* ---------- INITIALIZING VARIABLES ---------- */
int client;
int portNum = 1500; // NOTE that the port number is same for both client and server
bool isExit = false;
int bufsize = 1024;
char buffer[bufsize];
char* ip = "127.0.0.1";
struct sockaddr_in server_addr;
client = socket(AF_INET, SOCK_STREAM, 0);
/* ---------- ESTABLISHING SOCKET CONNECTION ----------*/
/* --------------- socket() function ------------------*/
if (client < 0)
{
cout << "\nError establishing socket..." << endl;
exit(1);
}
cout << "\n=> Socket client has been created..." << endl;
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(portNum);
/* ---------- CONNECTING THE SOCKET ---------- */
/* ---------------- connect() ---------------- */
if (connect(client,(struct sockaddr *)&server_addr, sizeof(server_addr)) == 0)
cout << "=> Connection to the server port number: " << portNum << endl;
cout << "=> Awaiting confirmation from the server..." << endl; //line 40
recv(client, buffer, bufsize, 0);
cout << "=> Connection confirmed, you are good to go...";
cout << "\n\n=> Enter # to end the connection\n" << endl;
// Once it reaches here, the client can send a message first.
do {
cout << "Client: ";
do {
cin >> buffer;
send(client, buffer, bufsize, 0);
if (*buffer == '#') {
send(client, buffer, bufsize, 0);
*buffer = '*';
isExit = true;
}
} while (*buffer != 42);
cout << "Server: ";
do {
recv(client, buffer, bufsize, 0);
cout << buffer << " ";
if (*buffer == '#') {
*buffer = '*';
isExit = true;
}
} while (*buffer != 42);
cout << endl;
} while (!isExit);
/* ---------------- CLOSE CALL ------------- */
/* ----------------- close() --------------- */
cout << "\n=> Connection terminated.\nGoodbye...\n";
close(client);
return 0;
}
Alles anzeigen
Nun habe ich folgendes Problem: Der eine Pi ist der Server, der andere der Client. Auf beiden hat der Code wunderbar kompiliert. Auch öffnen funktioniert auf beiden wunderbar. Nur findet der CLient den Server nicht. Nach aber etwa einer Minute startet der Client den Eingabevorgang, sprich er wirft mir die Meldung heraus, dass er sich verbunden hat. Das kann aber nicht sein, weil der Server wiederrum nichts meldet. DIeser wartet einfach auf eine Verbindung. Wenn ich beim Clienten dann irgendetwas eingebe, schmiert er sofort ab.
Ich bin etwas am verzweifeln, weil das noch der einfachste Part der Aufgabe ist, und ich auch eigentlich dachte, dass das leicht funktioniert. Ich finde auch einfach keinen Fehler im Code. Gibts vielleicht ne Möglichkeit herauszufinden, warum der Client denkt, er sei verbunden?
Vielen Dank im Voraus und liebe Grüße,
Philipp