Klient - serwer przesyłanie tablic


(klonmarcin) #1

witam, mam do napisania program klienta, który ma pobierać ciąg znaków wpisany przez usera do tablicy znaków, następnie tą tablicę wysyła do serwera, który to ma odwrócić wprowadzony tekst,

ogólnie połączenie klient i serwer mam zrobione, odwrócenie tekstu też tylko nie wiem jak przesłać i odebrać tablicę znaków za pomocą funkcji write i read.

wszystko to jest robione w języku c na linuksie i gdy przysyłam jedną liczbę wszystko gra a w jaki sposób przysyła się tablice?

mam takiego klienta i serwer ( oczywiście chodzi mi o część połączeniową)

#ifdef HAVE_CONFIG_H

#include 

#endif


#include 

#include 

#include 

#include 

#include 

#include 

#include 



/// CLIENT   



int main(int argc, char *argv[])

{

	printf("This is the client program\n");


	int sockfd;

	int len, rc ;

	struct sockaddr_in address;

	int result;

	char ch = 'A';


   //Create socket for client.

	sockfd = socket(PF_INET, SOCK_STREAM, 0);

	if (sockfd == -1) { 

		perror("Socket create failed.\n") ; 

		return -1 ; 

	} 


	//Name the socket as agreed with server.

	address.sin_family = AF_INET;

	address.sin_addr.s_addr = inet_addr("127.0.0.1");

	address.sin_port = htons(7734);

	len = sizeof(address);


	result = connect(sockfd, (struct sockaddr *)&address, len);

	if(result == -1)

	{

		perror("Error has occurred");

		exit(-1);

	}


	while ( ch < 'Y') {


		//Read and write via sockfd

		rc = write(sockfd, &ch, 1);

		printf("write rc = %d\n", rc ) ; 

		if (rc == -1) break ; 


		read(sockfd, &ch, 1);

		printf("Char from server = %c\n", ch);

		//if (ch == 'A') sleep(5) ; // pause 5 seconds 

	} 

	close(sockfd);


	exit(0);

}

#ifdef HAVE_CONFIG_H

#include 

#endif


#include 

#include 

#include 

#include 

#include 

#include 

#include 


/// SERVER   


int main(int argc, char *argv[])

{

	//Declaring process variables.

	int server_sockfd, client_sockfd;

	int server_len ; 

	int rc ; 

	unsigned client_len;

	struct sockaddr_in server_address;

	struct sockaddr_in client_address;


	//Remove any old socket and create an unnamed socket for the server.

	server_sockfd = socket(AF_INET, SOCK_STREAM, 0);

	server_address.sin_family = AF_INET;

	server_address.sin_addr.s_addr = htons(INADDR_ANY);

	server_address.sin_port = htons(7734) ; 

	server_len = sizeof(server_address);


	rc = bind(server_sockfd, (struct sockaddr *) &server_address, server_len);

	printf("RC from bind = %d\n", rc ) ; 


	//Create a connection queue and wait for clients

	rc = listen(server_sockfd, 5);

	printf("RC from listen = %d\n", rc ) ; 


	client_len = sizeof(client_address);

	client_sockfd = accept(server_sockfd, (struct sockaddr *) &client_address, &client_len);

	printf("after accept()... client_sockfd = %d\n", client_sockfd) ; 


	while(1)

	{

		char ch;

		printf("server waiting\n");


		//Accept a connection

		//client_len = sizeof(client_address);

		//client_sockfd = accept(server_sockfd, (struct sockaddr *) &client_address, &client_len);

		//printf("after accept()... client_sockfd = %d\n", client_sockfd) ; 

		//Read write to client on client_sockfd


		rc = read(client_sockfd, &ch, 1);

		printf("RC from read = %d\n", rc ) ; 		

		if (ch=='X') break ; 

		ch++;

		write(client_sockfd, &ch, 1);

	}


	printf("server exiting\n");


	//close(client_sockfd);

	close(client_sockfd);

	return 0;

}

teraz chodzi mi o to jak wczytać od usera ciąg znaków i przesłać do serwera, i ten po odwróceniu odsyła do klienta a klient wyświetla odwrócony tekst.


([alex]) #2

char tb[1024];

int len=strlen(tb);

write(client_sockfd,&len,sizeof(int));

write(client_sockfd,tb,len);

read(sockfd,&len,sizeof(int));

read(sockfd,tb,len);