Wysyłanie wiadomości do serwera eJabberd

0

Witam, borykam się z problemem zagadnienia socketów i ogółem wysyłaniem wiadomości do serwera, takiej jakiej on "oczekuje". Problem polega na tym, że jak podam daną wiadomość w funcji send to serwer otrzymuje źle sformatowany xml, a gdy wpiszę ten sam xml "z palca" to wszystko działa poprawnie. Podglądałam też ruch sieci wiresharkiem i mimo iż obie wiadomości wyglądają identycznie to jednak coś knoci się strasznie. Zaznaczam dodatkowo, że umieściłam całość w pętli while, ponieważ planuję stworzyć mini-chat (tak wiem, to może być kiepski pomysł). Chętnie poczytam wszelkie rady i uwagi, bo projekt ten robi się coraz bardziej nerwostratny.
Z góry dziękuję serdecznie :).

#include <sys/socket.h>
#include <stdio.h>
#include <netinet/in.h>
#include <string.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string>

int main() {

    char message[8000], recv_data[8000]; 
    struct sockaddr_in adr;
    unsigned int port = 5222;
    int sock, bytes_recieved;
    fd_set Read0;
    struct timeval tv;
 
    sock = socket(PF_INET, SOCK_STREAM, 0); 
    adr.sin_family = AF_INET;
    adr.sin_port = htons(port);
    adr.sin_addr.s_addr = inet_addr("127.0.0.1");
 
    if (connect(sock, (struct sockaddr*) &adr, sizeof(adr)) < 0) {
 
	printf("Błąd połączenia.\n"); 
	return 1;

    } 
         
    printf("Połączono\n");
    fflush(stdin);
    
    while (1) {
	

	FD_ZERO(&Read0);
	if (sock != 0) FD_SET(sock, &Read0);
	FD_SET(0, &Read0);

	int rv = select(FD_SETSIZE, &Read0, NULL, NULL, &tv);
	
	

	if (FD_ISSET(0, &Read0)) { 
  		
		send(sock, "<?xml version=\"1.0\"?> <stream:stream xmlns:stream=\"http://etherx.jabber.org/streams\" xmlns=\"jabber:client\" to=\"localhost\">", 123, 0);

	}

	if(rv == -1) { 
	
		printf("\nError in select\n");
		return 1;
	
	}

	else if (rv == 0) {
		
		tv.tv_sec = 1;
                tv.tv_usec = 0;

	}


	if( FD_ISSET(sock,&Read0) ) { 

		bytes_recieved = read(sock, recv_data, 8000);
	
		if (bytes_recieved < 0) printf("\nCouldn't receive data.\n");
		
		else {

			recv_data[bytes_recieved] = '\0';
			printf("%s", recv_data);
			fflush(0);
			
		}

	}



    }



close(sock); 
return 0;
}
0
  1. Kiedy coś nie działa, w pierwszej kolejności korzystamy z debuggera (ewentualnie logów) a nie z wiresharka i forum.
  2. Pod debuggerem od razu widać, że sterowanie nie wchodzi nawet do send-a. Nie ma szans na wysłanie wiadomości.
  3. Po co stosujesz select-a? Select to funkcja dla I/O multiplexing-u i nie ma w ogóle sensu po stronie klienta, to serwer ma obsługiwać wiele niezależnych strumieni danych a nie klient. Tak więc wszystko co związane z select-em tj. FD_ISSET, FD_ZERO można wywalić. Zostaje to i to działa:
 
int main()
{
	char message[8000], recv_data[8000];
	struct sockaddr_in adr;
	unsigned int port = 5222;
	int sock, bytes_recieved;
	fd_set Read0;
	struct timeval tv;

	sock = socket(PF_INET, SOCK_STREAM, 0);
	adr.sin_family = AF_INET;
	adr.sin_port = htons(port);
	adr.sin_addr.s_addr = inet_addr("127.0.0.1");

	if (connect(sock, (struct sockaddr*) &adr, sizeof(adr)) < 0)
	{
		printf("Błąd połączenia.\n");
		return 1;
	}
	printf("Połączono\n");
	fflush(stdin);
	send(sock, "<?xml version=\"1.0\"?> <stream:stream xmlns:stream=\"http://etherx.jabber.org/streams\" xmlns=\"jabber:client\" to=\"localhost\">", 123, 0);
	close(sock);
	return 0;
}

planuję stworzyć mini-chat (tak wiem, to może być kiepski pomysł)
Pomysł fajny bo można się sporo nauczyć jednak radzę Ci najpierw zająć się podstawami. Może zobacz sobie jak wygląda poprawnie napisany klient, serwer: http://beej.us/guide/bgnet/output/html/multipage/clientserver.html etc. W ogóle polecam całego beeja - b.dobry klasyczny już tutorial do programowania sieciowego.

1 użytkowników online, w tym zalogowanych: 0, gości: 1