Nochmal Sockets

shrewm

Mitglied
Hallo,
habe leider wiedermal ein Problem mit Socketprogrammierung unter MSVC++ 6
Folgender Code:
Code:
	// int bind(int sockfd, struct sockaddr *my_addr, int addrlen);
	struct sockaddr_in addr;
	addr.sin_addr.s_addr = INADDR_ANY;
	addr.sin_port = htons(80);
	addr.sin_family = AF_INET;

	if(bind(s, &addr, sizeof(addr)) == -1)
	{
		perror("bind() failed");
		return 2;
	}
Fehlermeldung:
error C2664: 'bind' : Konvertierung des Parameters 2 von 'struct sockaddr_in *' in 'const struct sockaddr *' nicht moeglich
Die Typen, auf die verwiesen wird, sind nicht verwandt; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat.

Weiss leider nichts damit anzufangen und wie ich den Fehler beheben kann. Fehler ist im Kopf der if-Schleife.

Danke schonmal
 
Jetz hab ich ein weiteres Problem :)
Ich habe das jetzt so gemacht, dass wenn ein Client zum Server verbunden wurde, der Server eine Willkommensmsg schicken soll. Schicken macht der Server auch, aber der Client empfängt nichts.

Clientcode zum Empfangen:
Code:
s = socket(AF_INET, SOCK_STREAM, 0);
for(;;)
{
	// int recv(int s, void *buf, int len, unsigned int flags);
	char buffer[BUFFER_SIZE];
	g = recv(s, buffer, sizeof(buffer) - 1, 0);
	if (g == -1)
	{
		perror("recv() fehlgeschlagen");
		return 3;
	}
	buffer[g] = '\0';
	printf("Server: %s", buffer);
}

Server code zum schicken:
Code:
for(;;)
{
	char buffer[BUFFER_SIZE];
	strcpy(buffer,"Willkommen auf dem Testserver\r\n");
	g = send(s, buffer, strlen(buffer), 0);
	if (g == -1)
	{
		perror("-> senden fehlgeschlagen");
		getch();
		return -1;
	}
}

Allerdings bekomme ich auch keine Fehlermeldung "recv() fehlgeschlagen". Sobald Zeile g = revc(...) erreicht wird, stoppt das Programm einfach. Keine Windowsfehlermeldung o.ä. aber das Programm macht einfach nicht weiter. Was stimmt da nicht?

Danke nochmal ;)
 
Zuletzt bearbeitet:
Moin,
bei der Socket-Kommunikation sind eine ganze Reihe von Befehlsfolgen einzuhalten, die ich hier mal aufliste. Prüf deinen Code mal daraufhin, ob alles vorhanden ist.

Server-Befehlsfolge
===========================
SOCKET server_socket = socket( ... )
bind ( ... )
listen ( ... )

// accept() versetzt das Programm nun in den Wartezustand.
// Wenn eine Nachricht eintrifft, wird "client_socket"
// gesetzt und es geht weiter.
client_socket = accept ( ... )

recv ( ... )

// Wichtig: Nach Empfang Bestätigung senden und socket schließen!
send ( );
closesocket (client_socket)



Client-Befehlsreihenfolge
===========================
SOCKET server_socket = socket ( ... )

// Verbindung zum Server-Socket aufnehmen
connect ( ... )

send( ... )

// Bestätigung auslesen und Socket schließen
recv ( ... )
closesocket (server_socket)
 
Ja, so habe ich das gemacht - geht aber trotzdem nicht :) Hier einmal der ganze Code, damit man es besser verfolgen kann:
Server:
Code:
#include <winsock.h>
#include <iostream>
#include <sys/types.h>
#include <string>
#include <conio.h>
//#include <socket.h>
#define BUFFER_SIZE 124

using namespace std;

int main()
{
	int s, c, g;

	// windows socket initialisieren
	WSADATA wsa;
	if (WSAStartup(MAKEWORD(1,1), &wsa))
	{
		printf("WSAStartup() failed, %lu\n", (unsigned long)GetLastError());
		return EXIT_FAILURE;
	}

	// int socket(int domain, int type, int protocol);
	s = socket(AF_INET,SOCK_STREAM,0);
	if (s == -1)
	{
		perror("socket() failed");
		return 1;
	}

	// int bind(int sockfd, struct sockaddr *my_addr, int addrlen);
	struct sockaddr_in addr;
	addr.sin_addr.s_addr = INADDR_ANY;
	addr.sin_port = htons(80);
	addr.sin_family = AF_INET;

	if(bind(s, (struct sockaddr*)&addr, sizeof(addr)) == -1)
	{
		perror("bind() failed");
		return 2;
	}

	// int listen(int s, int backlog);
	if(listen(s,3) == -1)
	{
		perror("listen() failed");
		return 3;
	}

	// int accept(in s, struct sockaddr *addr, int *addrlen);
	struct sockaddr_in cli;
	int cli_size;

	for(;;)
	{
		cli_size = sizeof(cli);
		c = accept(s, (struct sockaddr*)&cli, &cli_size);

		printf("Verbindung von %s\n", inet_ntoa(cli.sin_addr));

	}
//--------------------------------------------------------------
	for(;;)
	{
		char buffer[BUFFER_SIZE];
		strcpy(buffer,"Willkommen auf meinem Server\r\n");
		g = send(s, buffer, strlen(buffer), 0);
		if (g == -1)
		{
			perror("-> senden fehlgeschlagen");
			getch();
			return -1;
		}
	}
//--------------------------------------------------------------
	closesocket(c);
	getch();
	return 0;
}

Client:
Code:
#include <iostream>
#include <sys/types.h>
#include <winsock.h>
#include <conio.h>
#define BUFFER_SIZE 1024

using namespace std;

int main()
{
	int s, g;
	char ip[255];

	WSADATA wsa;
	if(WSAStartup(MAKEWORD(1,1), &wsa))
	{
		printf("WSAStartup() failed, %lu\n", (unsigned long)GetLastError());
			return EXIT_FAILURE;
	}

	// int socket(int domain, int type, int protocol);
	s = socket(AF_INET, SOCK_STREAM, 0);
	if (s == -1)
	{
		perror("socket() failed");
		return 1;
	}

	// int connect(int sockfd, struct sockaddr *serv_addr, int addrlen);
	// cin >> ip;
	struct sockaddr_in addr;
	addr.sin_addr.s_addr = inet_addr("127.0.0.1");
	addr.sin_port = htons(80);
	addr.sin_family = AF_INET;

	if(connect(s, (struct sockaddr*)&addr, sizeof(addr)) == -1)
	{
		perror("connect() failed");
		return 2;
	}

	for(;;)
	{
		// int recv(int s, void *buf, int len, unsigned int flags);
		char buffer[BUFFER_SIZE];
		g = recv(s, buffer, sizeof(buffer) - 1, 0);
		if (g == -1)
		{
			perror("recv() fehlgeschlagen");
			return 3;
		}
		buffer[g] = '\0';
		printf("Server: %s", buffer);
	}

	getch();
	return 0;
}

Wer findet den Fehler? :/
 
Hm, merkwürdig: Im Server-Code wird die erste Endlosschleife niemals verlassen werden können.
Im Client-Code wird ja gar nichts gesendet (send() fehlt).
 
Naja mein Problem ist ja, dass der Client noch nicht einmal das ausgibt, was der Server sendet. Mit recv() empfängt der Client ja, aber das gibt er halt nicht aus.
 
Das habe ich gerade auch geändert. Die zweite for-Schleife habe ich rausgenommen und die erste vom Server folgendermassen verändert:
Code:
	for(;;)
	{
		cli_size = sizeof(cli);
		c = accept(s, (struct sockaddr*)&cli, &cli_size);

		printf("Verbindung von %s\n", inet_ntoa(cli.sin_addr));
//--------------------------------------------------------------
		char buffer[BUFFER_SIZE];
		strcpy(buffer,"Willkommen auf meinem Server\r\n");
		g = send(s, buffer, strlen(buffer), 0);
		if (g == -1)
		{
			perror("-> senden fehlgeschlagen");
			getch();
			return -1;
		}
//--------------------------------------------------------------
	}
Allerdings bekomme ich jetzt immer "-> senden fehlgeschlagen" ausgegeben.
 
Zurück