// client

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>

void error(char *message);

int main(int argc,char *argv[])
{
    int sock;
    struct sockaddr_in serv_addr;
    char message[30];
    int str_len;

    if(argc!=3)
    {
        printf("Usage : %s <ip> <port> \n",argv[0]);
        exit(1);
    }

    sock=socket(PF_INET,SOCK_STREAM,0);
    if(sock == -1)
        error("socket() error");
   
    memset(&serv_addr,0,sizeof(serv_addr));
    serv_addr.sin_family=AF_INET;
    serv_addr.sin_addr.s_addr=inet_addr(argv[1]);
    serv_addr.sin_port=htons(atoi(argv[2]));

    if(connect(sock,(struct sockaddr*)&serv_addr,sizeof(serv_addr)) == -1)
    error("connect() error");

    str_len=read(sock,message,sizeof(message)-1);
    if(str_len == -1)
        error("read() error");
    message[str_len]=0;
    printf("message from server : %s \n",message);
    close(sock);
    return 0;
}

void error(char *message)
{
    fputs(message,stderr);
    fputc('\n',stderr);
    exit(1);
}


// Server

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>

void error(char *message);

int main(int argc,char *argv[])
{
    int serv_sock;
    int clnt_sock;
    struct sockaddr_in serv_addr;
    struct sockaddr_in clnt_addr;
    int clnt_addr_size;
    char message[]="hello world!\n";

    if(argc!=2)    {
        printf("Usage : %s <port> \n",argv[0]);
        exit(1);
    }

    serv_sock=socket(PF_INET,SOCK_STREAM,0);
    if(serv_sock == -1)
        error("socket() error");
   
    memset(&serv_addr,0,sizeof(serv_addr));
    serv_addr.sin_family=AF_INET;
    serv_addr.sin_addr.s_addr=htonl(INADDR_ANY);
    serv_addr.sin_port=htons(atoi(argv[1]));
   
    if(bind(serv_sock, (struct sockaddr*) &serv_addr,sizeof(serv_addr)) == -1)
        error("bind() error");
    if (listen(serv_sock,5) == -1)
        error("listen() error");
    clnt_addr_size=sizeof(clnt_addr);
    clnt_sock=accept(serv_sock,(struct sockaddr*)&clnt_addr,&clnt_addr_size);
    if(clnt_sock == -1)
        error("accept() error");

    write(clnt_sock,message,sizeof(message));
    close(clnt_sock);
    return 0;
}

void error(char *message)
{
    fputs(message,stderr);
    fputc('\n',stderr);
    exit(1);
}