Waves
Waves

Reputation: 1003

Server and client program not sending or receiving data

I've been scratching my head with this one for quite a while now. I've got a simple client and server program and I want the server to echo what the client sends it. I can't figure out why the server isn't receiving any data.

Client code:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

#define MAX_BUF  64
#define MAX_ARGS  8

void initClient(int*);

int main()
{
  int  socket;

/* initialize socket and connect to server */
  initClient(&socket);

  while(1){
    char in[80];
    char temp[80];
    bzero(in, 80);
    bzero(temp, 80);
    printf("What's your message: ");
    gets(in);
    strcpy(temp, in);
    send(socket, temp, strlen(temp), 0);
    if(strcmp(temp, "exit") == 0)
      break;
  }
  return 0;
}

void initClient(int *sock)
{
  FILE *configFile;
  char ip[MAX_BUF];
  int  port;
  int i;
  struct sockaddr_in addr;

/*  get IP address and port number from config file */
  if (!(configFile=fopen(".config","r"))) {
    printf("cannot read config file...\n");
    exit(1);
  }
  fscanf(configFile, "%s", ip);
  fscanf(configFile, "%d", &port);
  fclose(configFile);

/*  create socket and connect to logger */
  sock = (int *)socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
  if(sock < 0){
    printf("Could not open socket\n");
    exit(-1);
  }

/* setup address */
  memset(&addr, 0, sizeof(addr));
  addr.sin_family = AF_INET;
  addr.sin_addr.s_addr = inet_addr(ip);
  addr.sin_port = htons((unsigned short) port);

/* connect to server */
  i = connect((int)sock, 
          (struct sockaddr *) &addr,
          sizeof(addr));
  if (i<0) {
    printf("client could not connect!\n");
    exit(-1);
  }

}

Server code:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include <time.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

#define MAX_BUF  64

int main()
{
  FILE *configFile;
  char ip[MAX_BUF];
  int  port;
  char str[MAX_BUF];

/* get IP address and port number from config file */
  if (!(configFile=fopen(".config","r"))) {
    printf("cannot read config file...\n");
    exit(1);
  }
  fscanf(configFile, "%s", ip);
  fscanf(configFile, "%d", &port);
  fclose(configFile);

  int myListenSocket, clientSocket;
  struct sockaddr_in myAddr, clientAddr;
  int i, addrSize, bytesRcv;

  /* Create socket */
  myListenSocket = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
 if(myListenSocket < 0) {
    printf("Couldn't open socket\n");
    exit(-1);
 }

  /* Set up server address */
  memset(&myAddr, 0, sizeof(myAddr));
  myAddr.sin_family = AF_INET;
  myAddr.sin_addr.s_addr = htonl(INADDR_ANY); 
  myAddr.sin_port = htons((unsigned short) port); 

  /* Binding */
  i = bind(myListenSocket, (struct sockaddr *) &myAddr, sizeof(myAddr));
  if(i < 0){
    printf("Couldn't bind socket\n");
    exit(-1);
  }

  /* Listen */
  i = listen(myListenSocket, 5);
  if(i < 0){
    printf("Couldn't listen\n");
    exit(-1);
  }

  /* Wait for connection request */
  addrSize = sizeof(clientAddr);
  clientSocket = accept(myListenSocket, 
                       (struct sockaddr *) &clientAddr, 
                       &addrSize);

  if(clientSocket < 0){
    printf("Couldn't accept the connection\n");
    exit(-1);
  }

  /* Read message from client and do something with it */
  char buffer[100];
  while(1){
    bzero(buffer, 100);
    bytesRcv = read(clientSocket, buffer, sizeof(buffer));
    buffer[bytesRcv] = 0;
    printf("this is what the client sent:  %s\n", buffer);
    if(bytesRcv == 0){
      break;
    }
  }
  close(myListenSocket);
  close(clientSocket);

  return 0;
}

Upvotes: 0

Views: 722

Answers (1)

ja_mesa
ja_mesa

Reputation: 1969

When you pass a pointer you should reference it as *sock to get its value, otherwise if you reference it as sock you are, in fact, getting the address and not the value of the variable.

Here is your initClient function corrected:

void initClient(int *sock)
{
  FILE *configFile;
  char ip[128];
  int  port;
  int i;
  struct sockaddr_in addr;

/*  get IP address and port number from config file */
  if (!(configFile=fopen(".config","r"))) {
    printf("cannot read config file...\n");
    exit(1);
  }
  fscanf(configFile, "%s", ip);
  fscanf(configFile, "%d", &port);
  fclose(configFile);

/*  create socket and connect to logger */
  *sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
  if(*sock < 0){
    printf("Could not open socket\n");
    exit(-1);
  }

/* setup address */
  memset(&addr, 0, sizeof(addr));
  addr.sin_family = AF_INET;
  addr.sin_addr.s_addr = inet_addr(ip);
  addr.sin_port = htons((unsigned short) port);

/* connect to server */
  i = connect(*sock, (struct sockaddr *) &addr, sizeof(addr));
  if (i<0) {
    printf("client could not connect!\n");
    exit(-1);
  }
}

Upvotes: 1

Related Questions