sending mpz_t over tcp network

Veress Krisztián cszenith at tvnetwork.hu
Fri Apr 7 23:06:56 CEST 2006


Dear gmp users,

I would like to send an alone mpz_t integer over tcp/ip from a server
towards a client, but on the client side I'm always reading 1 bytes,
when I'm sending 15 bytes on the server side.(I get these numbers from
recv and send.)
Could anyone tell me where I am wrong in the C code below, or an
alternate solution? 
I probed to convert mpz_t to string, and send this one, but the same.

Here is my code, and thanks:

server.c:

#include <sys/socket.h>
#include <netdb.h>
#include <sys/time.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <arpa/inet.h>
#include <gmp.h>

int read_from_client (int filedes, mpz_t *adat);
int main(int argc, char* argv[0])
{
  /* input ellenőrzés */
  if(argc != 3)
  {
     printf("Használat: %s <port> <max_clients>\n",argv[0]);
     return 0;
  }
  if( atoi(argv[1]) < 1025 || atoi(argv[1]) > 65535)
  {
    printf("A port nem megfelelő! (1025 - 65535)\n");
    return 0;
  }
  if( atoi(argv[2]) > 65535 || atoi(argv[2]) < 2)
  {
    printf("A kliensek száma nem megfelelő! (2 - 65535)\n");
    return 0;
  }
  unsigned short int port = atoi(argv[1]);
  unsigned short int max_clients = atoi(argv[2]);
  

  /* szerver beállítása */
  struct sockaddr_in server;  
  memset(&server, 0, sizeof(server));
  server.sin_family = AF_INET;
  server.sin_port = htons(port);  
  server.sin_addr.s_addr = INADDR_ANY;

  
  /* szerver indítása */
  int server_fd = 0;
  if (( server_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0 )
  {      
    perror("Nincs elég erőforrás a szerver számára!\n");
    return 0;
  }  
  if(bind(server_fd, (struct sockaddr*)&server, sizeof(struct sockaddr))
== -1)
  { 
    perror("Nem tudtam elindítani a szervert!\n");
    return 0;
  }
  if(listen(server_fd, max_clients) < 0)
  {
    perror("Nem tudtam elindítani a szervert!\n");
    return 0;
  }
  int i = 0;
  int dtablesize = getdtablesize();

  /*
   * SZERVER KÉSZ
   */  

  /* van 1 db socketünk, amelyen kapcsolatra várunk */
  fd_set rfd;
  fd_set c_rfd;
  FD_ZERO(&rfd);
  FD_SET(server_fd, &rfd);

  struct sockaddr_in clients;
  socklen_t sin_size = sizeof(struct sockaddr_in);
  int rc=0, new_conn_fd=0;

  /* olvasó buffer */
  
  mpz_t k;
  mpz_init_set_ui(k,(unsigned long)341891823);
  printf("size: %d\n",mpz_size(k));
  /* accept-write-close végtelen ciklusba lépünk */  
  while (1)
  {
    
    c_rfd = rfd;
    rc = select(dtablesize, &c_rfd, NULL, NULL, NULL);    

    /* új kapcsolódási kísérlet! */
    if (FD_ISSET(server_fd, &c_rfd)) 
    {
      if( (new_conn_fd = accept(server_fd, (struct sockaddr *)&clients,
&sin_size)) != -1)
      {
	rc = send(new_conn_fd, &k, mpz_size(k), 0);
	gmp_printf("Küldés : %Zd - %d bytes\n",k,rc);
	FD_SET(new_conn_fd,&rfd);
	continue;
      }
    }    
    /* esetleg valamilyen kommunikáció a kliensektől? */
    for (i=0; i<dtablesize; i++)
    {
      if (i != server_fd && FD_ISSET(i, &c_rfd))
      {
	/* adat olvasása a klienstől */
	rc = read_from_client(i,&k);
	
	/* ha a kliens bontotta a kapcsolatot */
	if ( rc < 0 )
	{
	  printf("Egy node lekapcsolódott a szerverről!\n");
	  close(i);
	  FD_CLR(i, &rfd);
    	}
	/* ha az olvasás helyesen megtörtént */
        else
	{
	  continue;
	}
      }
    }
  }/*while*/
  mpz_clear(k);
}

int read_from_client (int filedes, mpz_t* adat)
{
  int nbytes;
  nbytes = read (filedes, adat, mpz_size(*adat));
  if (nbytes < 0)
  {
    /* Olvasási hiba */
    perror ("Olvasási hiba!");
    exit (EXIT_FAILURE);
  }
  else if (nbytes == 0)
  {
    /* Kapcsolatot bontja a kliens */
    return -1;
  }
  return nbytes;
}




client.c:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <string.h>
#include <unistd.h>
#include <gmp.h>
int read_from_server (int filedes, mpz_t *adat);

int main(int argc, char *argv[])
{
  if (argc != 3) 
  {       
    printf("Használat : %s <IP cím> <port>\n", argv[0]);
    return 0;
  }
  if( atoi(argv[2]) < 1025 || atoi(argv[2]) > 65535)
  {
    printf("A port nem megfelelő! (1025 - 65535)\n");
    return 0;
  }
  unsigned short int port = atoi(argv[2]);
  int client_fd;
  struct hostent *he;
  struct sockaddr_in server;
  if ( (he = gethostbyname(argv[1])) == NULL )
  {
    perror("A szervert nem találom, valószínűleg nem elérhető!\n");
    return 0;
  }
  if ((client_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
  {
    perror("Nincs elég erőforrás a program számára!\n");
    return 0;
  }
  memset(&server, 0, sizeof(server));
  server.sin_family = AF_INET;
  server.sin_port = htons(port);
  server.sin_addr = *((struct in_addr *)he->h_addr);
  /* kapcsolódás a szerverhez */
  if(connect(client_fd, (struct sockaddr *)&server, sizeof(struct
sockaddr)) == -1)
  {
    perror("Nem tudtam csatlakozni a szerverhez.\n");
    return 0;
  }
  printf("A kapcsolat létrejött a szerverrel : %s:%d.\n\n",
(char*)inet_ntoa(server.sin_addr), ntohs(server.sin_port));

  mpz_t k;
  mpz_init(k);
  int rc;
  /* addig olvasunk, amíg 0-t nem ad vissza a read_from_server, azaz a
szerver bontotta a kapcsolatot */
  while ((rc=read_from_server(client_fd, &k)))
  {
    gmp_printf("Olvasva: %Zd - %d bytes\n",k,rc);
    break;
    /* itt megkapjuk a részfeladatot, kiszámoljuk, visszaküldjük*/
  }
  mpz_clear(k);
  
  printf("Kilépek...\n");
  shutdown(client_fd, 2);
  return 0;
}

int read_from_server (int filedes, mpz_t* adat)
{
  int nbytes;
  nbytes = read(filedes, adat, mpz_size(*adat));
  if (nbytes < 0)
  {
    /* Olvasási hiba */
    perror ("Olvasási hiba!");
    exit (EXIT_FAILURE);
  }
  else if (nbytes == 0)
  {
    /* Kapcsolatot bontja a szerver */
    return 0;
  }
  else
  {
    /* Helyes olvasás */
    return 1;
  }
}




More information about the gmp-discuss mailing list