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 件のコメント:
コメントを投稿