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;
}

0 件のコメント:

コメントを投稿