ラベル TCP の投稿を表示しています。 すべての投稿を表示
ラベル TCP の投稿を表示しています。 すべての投稿を表示

2013年7月7日日曜日

TCP サーバー  Linux用

simple tcp server source code for testing.

TCPサーバーです。TCPクライアントと対で使います。サーバーを立ち上げておいて、クライアントから通信します。
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
char buf[20000];
extern int h_errno;
int main( int argc, char **argv)
{
    int total = 0;
    int c;
    int i;
    int sock;
    struct sockaddr_in addr;
    char senderstr[512];
    char *ips = "";        // server IP
    char *ipd = "0.0.0.0";    // no use
    int    nPort = 12345;    // server port
    int    nCount = 10;    // reply times (10)
    int    nInt   = 100;    // interval 100ms
    int    bReply = 0;    // no use
    int datalen = 1024;    // send data length (max sizeof(buf))
    int ses = 0;    // session seq number
    opterr = 0;
    while(( c = getopt(argc, argv, "s:d:p:n:t:rhl:")) != -1)
    {
        switch(c)
        {
        case 'l':
            datalen = atol(optarg);
        case 'h':
            printf(" tcpr (server for 1 client only)\n");
            printf(" -s xxx.xxx.xxx.xxx :  server IP [INETADDR_ANY]\n");
            printf(" -p 9999            :  server port [12345]\n");
            printf(" -n 999             :  count of repeat send data [10] (for no-req)\n");
            printf(" -t 999             :  interval time of sending [100]msec (for no-req)\n");
            printf(" -l 9999            :  replay data length [1024]byte (for no-req)\n");
            printf("  \n");
            return 0;
        case 's':
            ips = optarg;
            break;
        case 'd':
            ipd = optarg;
            break;
        case 'p':
            printf("-p %p\n", optarg);
            if (optarg)
                nPort = atol(optarg);
            break;
        case 'n':
            if (optarg)
                nCount = atol(optarg);
            break;
        case 't':
            if (optarg)
                nInt = atol(optarg);
            break;
        case 'r':
            bReply = 1;
            break;
        }
    }
    if (datalen > sizeof(buf))
        datalen = sizeof(buf);
    printf("\n tcpr (server)\n");
    printf(" Src = %s, Dst = %s, Port=%d, Count=%d, Interval=%dmsec len=%d\n",
            ips, ipd, nPort, nCount, nInt, datalen);
    sock = socket(AF_INET,SOCK_STREAM, 0);
    if (1)
    {
        int ret;
        int on = 1;
        ret = setsockopt( sock, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on) );
        if (ret)
        {
            close(sock);
            printf("setsockopt error  %d \n", h_errno);
            return 0;
        }
    }
    addr.sin_family = AF_INET;
    addr.sin_port = htons(nPort);
    if (strlen(ips))
        addr.sin_addr.s_addr = inet_addr(ips);
    else
        addr.sin_addr.s_addr = INADDR_ANY;
    if (bind(sock, (struct sockaddr *)&addr, sizeof(addr)))
    {
        close(sock);
        printf("bind error  %d\n", h_errno);
        return 0;
    }
    printf("--- bind port=%d \n", ntohs(addr.sin_port));
    if (listen(sock, 2))
    {
        close(sock);
        printf(" listen error %d\n", h_errno);
        return 0;
    }
    i = 0;
    while (1)
    {
        int i;
        int addrlen;
        int reclen;
        int sockC;
        int rlen = datalen;
        int rcnt = nCount;
        int rint = nInt;
        char *pPos;
        memset(buf, 0, sizeof(buf));
        addrlen = sizeof(addr);
        sockC = accept(sock, (struct sockaddr *)&addr, &addrlen);
        if (sockC < 0)
        {
            printf("accept error %d\n", h_errno);
            break;
        }
        total = 0;
        ses++;
        printf("start session .... [%d]\n", ses);
        memset(buf, 0, sizeof(buf));
        reclen = recv(sockC, buf, sizeof(buf) - 1, 0);
        if (reclen <= 0)
        {
            printf("recv error %d\n", h_errno);
            close(sockC);
            continue;
        }
        inet_ntop(AF_INET, &addr.sin_addr, senderstr, sizeof(senderstr));
        printf("RCV<<<%s", buf);
        printf("... %s %d  len=%d... ", senderstr, ntohs(addr.sin_port), reclen);
        printf("\n");
        pPos = strstr(buf, "-L");
        if (pPos)
        {
            int n = atol(pPos + 2);
            if (n)
                rlen = n;
        }
        pPos = strstr(buf, "-C");
        if (pPos)
        {
            int n= atol(pPos + 2);
            if (n)
                rcnt = n;
        }
        pPos = strstr(buf, "-T");
        if (pPos)
        {
            int n= atol(pPos + 2);
            if (n)
                rint = n;
        }
        printf(" reply length=[%d], [%d]times, interval [%d]msec\n",
                rlen, rcnt, rint);
        for ( i = 0; i < rcnt; i++)
        {
        /// reply
            memset(buf, i & 0xf | '0', rlen);
            sprintf(buf, "Reply %04d", i);
            sendto(sockC, buf, rlen, 0, (struct sockaddr *)&addr, sizeof(addr));
            printf("SND>>>%s", buf);
             printf("... %d\n", rlen);
            usleep(rint * 1000);    // nInt msec
            total += datalen;
        }
        close(sockC);
        printf("..... close session [%d], total send length=%d\n", ses, total);
        total = 0;
    }
   
    close(sock);
    return 1;
}

TCP クライアント Linux用

simple tcp client source code for testing.
TCPパケットを送信して、受信を待つというプログラムです。 このブログのTCPサーバーと対で使います。クライアント側から受信すべきデータのサイズと送信インターバルを指定できます。
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
extern int h_errno;
char buf[20000];

char logtimes[128];
#include <sys/time.h>
#include <time.h>
const char *logtime()
{
    struct timeval tv;
    struct tm * tm;
    gettimeofday(&tv, 0);
    tm =  (struct tm *)localtime(&tv.tv_sec);
    sprintf(logtimes,"%02d/%02d/%02d %02d:%02d:%02d.%03d ",
        tm->tm_year - 100, tm->tm_mon + 1, tm->tm_mday,
        tm->tm_hour, tm->tm_min, tm->tm_sec,
        (int)(tv.tv_usec/ 1000));
    return logtimes;
}
int main(int argc, char *argv[])
{
    int total = 0;
    int i;
    int sock;
    struct sockaddr_in addr;
    char *ips = "0.0.0.0";
    char *ipd = "0.0.0.0";
    int    nPort = 12345;
    int    nCount = 0;
    int    nInt   = 0;
    int   rlen = 0;
    int c;
    int bWait = 1;
    int datalen = 1024;
    opterr = 0;
    i = time(0) % 10000;
    while(( c = getopt(argc, argv, "s:d:p:n:t:w:l:hr:")) != -1)
    {
        switch(c)
        {
        case 'l':
            datalen = atol(optarg);
            break;
        case 'h':
            printf(" tcps (client) \n");
            printf(" -d xxx.xxx.xxx.xxx :  server IP [0.0.0.0]\n");
            printf(" -p 9999            :  server port [12345]\n");
            printf(" -l 9999            :  send packet size [1500]\n");
            printf(" -w [0|1]           :  wait reply data [1:Wait]\n");
            printf(" -n 9999            :  request reply count [no-request]\n");
            printf(" -t 9999            :  request reply interval milli-sec. [no-request]\n");
            printf(" -r 9999            :  request reply length byte. [no-request]\n");
            printf("  \n");
            return 0;
            break;
        case 's':
            ips = optarg;
            break;
        case 'd':
            ipd = optarg;
            break;
        case 'p':
            printf("-p %p\n", optarg);
            if (optarg)
                nPort = atol(optarg);
            break;
        case 'n':
            if (optarg)
                nCount = atol(optarg);
            break;
        case 't':
            if (optarg)
                nInt = atol(optarg);
            if (nInt <= 0)
                nInt = 1;
            break;
        case 'w':
            bWait = atol(optarg);
            break;
        case 'r':
            rlen = atol(optarg);
            break;
        }
    }
    if (datalen > sizeof(buf))
        datalen = sizeof(buf)+
    printf("\n tcps (client)\n");
    printf(" Src = %s, Dst = %s, Port=%d, send datalen=%d %s\n",
             ips, ipd, nPort, datalen, bWait ? "Wait" : "Not-Wait");
    printf(" Request legnth=%d, count=%d, interval=%dmsec\n",
            rlen, nCount, nInt);
    sock = socket(AF_INET,SOCK_STREAM, 0);
    addr.sin_family = AF_INET;
    addr.sin_port = htons(nPort);
    addr.sin_addr.s_addr = inet_addr(ipd);
    if (connect(sock, (struct sockaddr *)&addr,sizeof(addr)) != 0)
    {
        printf("connect error %d\n", h_errno);
        close(sock);
        return 0;
    }
    memset(buf, i & 0x07f, sizeof(buf));
    sprintf(buf, "P%04d-L%d-C%d-T%d", i,
        rlen, nCount, nInt);
    sendto(sock, buf, datalen, 0, (struct sockaddr *)&addr, sizeof(addr));
    printf("%sSND>>>%s",logtime(), buf);
    printf("... %d\n", datalen);
    while(bWait)
    {
        int addrlen;
        char senderstr[256];
        int reclen;
        memset(buf, 0, sizeof(buf));
        reclen = read(sock, buf, sizeof(buf) - 1);
        if (reclen <= 0)    // if host is closed ?
            break;
        total += reclen;
        printf("%sRCV<<<%s",logtime(), buf);
        printf("... len=%d... ", reclen);
        printf("\n");
        usleep(10);
    }
    printf(" total length=%d\n", total);
    printf(" ... end.\n");
    close(sock);
    return 1;
}