buffoon
16-09-2007, 20:47
Hi!
Ich bin gerade dabei mich ein bisschen in die sockets einzuarbeiten. Ich gehe nach folgendem tutorial vor:
http://www.pronix.de/pronix-278.html
Der Unterschied hierzu ist, dass ich das alles in c++ machen will, da ich das dann in Klassen rein hauen kann welche ich später in einem anderen Programm verwenden werde, aber das dürfte wohl nicht so das Problem sein...
Das Programm will sich jetzt nicht an einen Port binden. Ich bekomme immer die Ausgabe:
buffoon@buffoon:~/cpp/netzwerk$ ./server
Socket wurde angelegt
Der Port ist nicht frei
Nachricht zum Versenden
und das Programm sieht so aus:
#include <iostream>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
#define BUF 1024
using namespace std;
int main()
{
int create_socket ,new_socket;
socklen_t addrlen;
char *buffer = (char *) malloc(BUF);
ssize_t size;
struct sockaddr_in address;
const int y = 1;
if(create_socket = socket (AF_INET, SOCK_STREAM, 0) > 0)
cout << "Socket wurde angelegt" << endl;
else
{
cout << "Socket konnte nicht angelegt werden" << endl;
exit(1);
}
setsockopt( create_socket, SOL_SOCKET, SO_REUSEADDR, &y, sizeof(int));
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(15000);
if(bind(create_socket, (struct sockaddr *) &address, sizeof (address)) !
= 0)
{
cout << "Der Port ist nicht frei" << endl;
}
listen (create_socket, 5);
addrlen = sizeof(sockaddr_in);
while (1)
{
new_socket = accept (create_socket, (struct sockaddr *) &address
, &addrlen);
if(new_socket > 0)
cout << "Ein Client (" << inet_ntoa(address.sin_addr) <<
") ist verbunden" << endl;
do
{
cout << "Nachricht zum Versenden" << endl;
fgets(buffer, BUF, stdin);
send(new_socket, buffer, strlen (buffer), 0);
size = recv(new_socket, buffer, strlen(buffer), 0);
if (size > 0)
buffer[size] = '\0';
cout << "Nachricht empfangen: " << buffer << endl;
} while (strcmp (buffer, "quit\n") != 0);
close (new_socket);
}
close (create_socket);
exit (0);
}
Ich bin gerade dabei mich ein bisschen in die sockets einzuarbeiten. Ich gehe nach folgendem tutorial vor:
http://www.pronix.de/pronix-278.html
Der Unterschied hierzu ist, dass ich das alles in c++ machen will, da ich das dann in Klassen rein hauen kann welche ich später in einem anderen Programm verwenden werde, aber das dürfte wohl nicht so das Problem sein...
Das Programm will sich jetzt nicht an einen Port binden. Ich bekomme immer die Ausgabe:
buffoon@buffoon:~/cpp/netzwerk$ ./server
Socket wurde angelegt
Der Port ist nicht frei
Nachricht zum Versenden
und das Programm sieht so aus:
#include <iostream>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
#define BUF 1024
using namespace std;
int main()
{
int create_socket ,new_socket;
socklen_t addrlen;
char *buffer = (char *) malloc(BUF);
ssize_t size;
struct sockaddr_in address;
const int y = 1;
if(create_socket = socket (AF_INET, SOCK_STREAM, 0) > 0)
cout << "Socket wurde angelegt" << endl;
else
{
cout << "Socket konnte nicht angelegt werden" << endl;
exit(1);
}
setsockopt( create_socket, SOL_SOCKET, SO_REUSEADDR, &y, sizeof(int));
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(15000);
if(bind(create_socket, (struct sockaddr *) &address, sizeof (address)) !
= 0)
{
cout << "Der Port ist nicht frei" << endl;
}
listen (create_socket, 5);
addrlen = sizeof(sockaddr_in);
while (1)
{
new_socket = accept (create_socket, (struct sockaddr *) &address
, &addrlen);
if(new_socket > 0)
cout << "Ein Client (" << inet_ntoa(address.sin_addr) <<
") ist verbunden" << endl;
do
{
cout << "Nachricht zum Versenden" << endl;
fgets(buffer, BUF, stdin);
send(new_socket, buffer, strlen (buffer), 0);
size = recv(new_socket, buffer, strlen(buffer), 0);
if (size > 0)
buffer[size] = '\0';
cout << "Nachricht empfangen: " << buffer << endl;
} while (strcmp (buffer, "quit\n") != 0);
close (new_socket);
}
close (create_socket);
exit (0);
}