2013年7月7日日曜日

UDP クライアント Linux用

simple udp client source code for testing.

簡単に言えば、固定フォーマットデータをUDPパケットとして指定のアドレス、ポートに投げるだけのプログラム。あちこちに転がっているものと同じ。
常にWiresharkでパケット内容を確認する必要があります。
#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>
int main(int argc, char *argv[])
{
    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 = 10;
    int    nInt   = 1000;
    int c;
    int bWait = 0;
    opterr = 0;
    while(( c = getopt(argc, argv, "s:d:p:n:t:wh")) != -1)
    {
        switch(c)
        {
        case 'h':
            printf(" udps \n");
            printf(" -d xxx.xxx.xxx.xxx :  server IP [0.0.0.0]\n");
            printf(" -p 9999           :  server port [12345]\n");
            printf(" -n 99999          :  send packet count [10]\n");
            printf(" -t 9999           :  interval time [1000]msec\n");
            printf(" -w                :  wait reply data [Not-Wait]\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 = 1;
            break;
        }
    }
    printf("\n udps\n");
    printf(" Src = %s, Dst = %s, Port=%d, Count=%d, Interval=%dmsec %s\n", ips, ipd, nPort, nCount, nInt, bWait ? "Wait" : "Not-Wait");
    sock = socket(AF_INET,SOCK_DGRAM, 0);
    addr.sin_family = AF_INET;
    addr.sin_port = htons(nPort);
    addr.sin_addr.s_addr = inet_addr(ipd);
    for (i = 0; i < nCount; i++)
    {
        char szWk[257];
        memset(szWk, i & 0x07f, sizeof(szWk));
        sprintf(szWk, "H%04d", i);
        sendto(sock,szWk, 256, 0, (struct sockaddr *)&addr, sizeof(addr));
        printf("SND>>>%s", szWk);
         printf("... %d\n", 256);
        usleep(nInt * 1000);
        if (bWait)
        {
            char buf[1000];
            int addrlen;
            char senderstr[256];
            int reclen;
            struct sockaddr_in r_addr;
            memset(buf, 0, sizeof(buf));
            addrlen = sizeof(r_addr);
            reclen = recvfrom(sock, buf, sizeof(buf) - 1, 0, (struct sockaddr *)&r_addr, &addrlen);
            inet_ntop(AF_INET, &r_addr.sin_addr, senderstr, sizeof(senderstr));
            printf("RCV<<<%s", buf);
            printf("... %s %d  len=%d... ", senderstr, ntohs(addr.sin_port), reclen);
            printf("\n");
        }
    }
    sendto(sock,"END", 3, 0, (struct sockaddr *)&addr, sizeof(addr));
    close(sock);
    return 1;
}

0 件のコメント:

コメントを投稿