読者です 読者をやめる 読者になる 読者になる

kitak.blog

Kみたいなエンジニアになりたいブログ

クライアントプログラム

/* コネクション型対話プログラム (クライアント)  */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <string.h>

#define BUF_MAX  100              /* 送受信のバッファの大きさ */
#define Err(x) {fprintf( stderr,"server-"); perror(x); exit(0);}
char buf[BUF_MAX]; /* 送受信のバッファ  */

main(int argc,char* argv[])
{
  /* argc:3 argv[0]:プログラム名 argv[1]:サーバのホスト名 argv[2]:サーバのポート番号 */
        /* 変数宣言 */
        struct hostent  *shost; /* サーバ(相手)の情報 */
        struct sockaddr_in  server;  /* サーバ(相手)のアドレス */
        int s;                     /* ソケットのディスクリプタ */
        u_short port_no = (u_short)atoi(argv[2]);             /* サーバのポート番号,argv[2]をu_short型に変換 */
        union{
                unsigned int i;
                unsigned char c[4];
        }ipaddr;

        /* サーバ(相手)のホスト名からアドレス情報を得る  */
        if((shost = gethostbyname(argv[1])) == NULL)
                Err("gethostbyname");

        /* サーバ(相手)のアドレスを sockaddr_in 構造体に格納  */
        bzero((char *)&server, sizeof(server));
        server.sin_family = AF_INET;
        server.sin_port = htons(port_no);
        bcopy(shost->h_addr, (char *)&server.sin_addr, shost->h_length);

        ipaddr.i=server.sin_addr.s_addr;
        printf("%d.%d.%d.%d\n",ipaddr.c[0],ipaddr.c[1],ipaddr.c[2],ipaddr.c[3]);

        /* IPv4でストリーム型のソケットを作成  */
        if((s = socket(AF_INET, SOCK_STREAM, 0)) < 0)
                Err("socket");

        /* サーバ(相手)に接続  */
        if(connect(s, (struct sockaddr *)&server, sizeof(server)) == -1)
                Err("connect");

        /* 相手が先 */
        write(1, "Wait\n", 5);

        /* 通信のループ */
        do{
                int n;                       /* 読み込まれたバイト数  */

                write(1,"--Message from server.--\n",25);
                n = read(s, buf, BUF_MAX); /* ソケットsocから読む   */
                write(1, buf, n);            /* 標準出力1に書き出す   */
                write(1,"--Enter your message.--\n",24);
                n = read(0, buf, BUF_MAX);   /* 標準入力0から読む     */
                write(s, buf, n);          /* ソケットsocに書き出す */
        }
        while( strncmp(buf, "quit" ,4) != 0 );        /* 終了判定 */

        /* ソケットを閉じる */
        close(s);
}