/*
 * tcp_client.c
 */

#include <stdio.h>
#include <iostream.h>
#include <memory.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
 
#define SERV_TCP_PORT  18934
#define SERV_HOST_ADDR "128.4.40.86"  /* mudskipper4.eecis.udel.edu */
// #define SERV_HOST_ADDR "128.4.131.63"  /* wheatgrass.cis.udel.edu */
// #define SERV_HOST_ADDR "128.175.13.74" /* strauss.udel.edu */
 
main(int argc, char *argv[])
{
	int    sockfd, c_len, s_len, err_code, msg_len;
	struct sockaddr_in  serv_addr, cli_addr;

  	char my_id[128], my_msg[256], buffer[1024];

	cerr << "client is running...\n" << endl;

	memset((char *) &serv_addr,'\0',  sizeof(serv_addr));
	serv_addr.sin_family = AF_INET;
        serv_addr.sin_addr.s_addr = inet_addr(SERV_HOST_ADDR);
        serv_addr.sin_port = htons(SERV_TCP_PORT);

	if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
		cout << "client: can't open stream socket" << endl ;
		return -1;
	}

	err_code = connect(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr));
	cerr << "after connect()...\n" << endl;

	if (err_code < 0) {
		cerr << "error number is " << err_code << endl;
		cerr << "client: can't connect to server" << endl; 
	}
	else {
          c_len = sizeof(struct sockaddr);
          err_code = getsockname(sockfd, (struct sockaddr*) &cli_addr, &c_len);
          cerr << "status = " << err_code << endl;
          if (err_code == 0) {
            cerr << "port # " << cli_addr.sin_port << endl;
            cerr << "IP " << ((cli_addr.sin_addr.s_addr & (255 << 24)) >> 24) << endl;
            cerr << "IP " << ((cli_addr.sin_addr.s_addr & (255 << 16)) >> 16) << endl;
            cerr << "IP " << ((cli_addr.sin_addr.s_addr & (255 << 8)) >> 8) << endl;
            cerr << "IP " << (cli_addr.sin_addr.s_addr & 255) << endl;
          }

        s_len = sizeof(struct sockaddr_in);
        err_code = getpeername(sockfd, (sockaddr *) &serv_addr, &s_len);

  	sprintf(my_id, "[%d.%d.%d.%d:%d--%d.%d.%d.%d:%d]", 
                 ((cli_addr.sin_addr.s_addr & (255 << 24)) >> 24),
                 ((cli_addr.sin_addr.s_addr & (255 << 16)) >> 16),
                 ((cli_addr.sin_addr.s_addr & (255 << 8)) >> 8),
                 (cli_addr.sin_addr.s_addr & 255),
                 cli_addr.sin_port,
                 // SERV_HOST_ADDR,
                 // SERV_TCP_PORT); 
                 ((serv_addr.sin_addr.s_addr & (255 << 24)) >> 24),
                 ((serv_addr.sin_addr.s_addr & (255 << 16)) >> 16),
                 ((serv_addr.sin_addr.s_addr & (255 << 8)) >> 8),
                 (serv_addr.sin_addr.s_addr & 255),
                 serv_addr.sin_port);

  sprintf(my_msg, "proj_1 %s c.c.shen:cshen Amazon.com\n", my_id);
  cerr << my_msg << endl;

 	  printf("I connect it...[%s]\n", my_msg);

	  write(sockfd, my_msg, strlen(my_msg));

          while (1) {
            msg_len = read(sockfd, buffer, 1024);

            if (msg_len <= 0) break;

            buffer[msg_len] = '\0';
            printf("msg = <%s> length %d\n", buffer, msg_len);
          }
        }

	close(sockfd);
}
