/*
Simple Socket Client
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <time.h>
#include <limits.h>
#include <ctype.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
int retryTotal=0;
#define PORT 9876 //サーバープログラムとポート番号を合わせてください
int connect2(struct sockaddr_in * dstAddr, int dstAddrLen)
{
int dstSocket;
int retry = 0;
int retryMax = 10;
time_t start_time, end_time;
double dtime;
while (1) {
//ソケットの生成
dstSocket = socket(AF_INET,
SOCK_STREAM, 0);
//接続
write(1,"Connecting...",13);
time( &start_time );
if (connect(dstSocket, (struct sockaddr
*)dstAddr, dstAddrLen) == 0) return(dstSocket);
time( &end_time );
dtime=difftime( end_time, start_time );
retry++;
printf("接続できませんでした retry=%d
difftime=%f\n",retry,dtime);
retryTotal++;
close(dstSocket);
if (retry > retryMax) return(-1);
sleep(10);
}
}
int main(int argc, char **argv){
// IP アドレス,ソケット,sockaddr_in 構造体
char destination[32];
int dstSocket;
struct sockaddr_in dstAddr;
//struct sockaddr_in addr;
struct hostent *hp;
char buf[1024];
int number = 0;
int numrcv;
int loopMax;
int loopCnt;
time_t start_time=0, end_time;
double dtime;
loopMax=INT_MAX;
if (argc == 2) {
loopMax=atoi(argv[1]);
}
// 相手先アドレスの入力と送る文字の入力
printf("サーバーマシンのIPは?:");
scanf("%s", destination);
//sockaddr_in 構造体のセット
//bzero((char *)&dstAddr, sizeof(dstAddr));
memset((char *)&dstAddr, 0, sizeof(dstAddr));
dstAddr.sin_family = AF_INET;
dstAddr.sin_port = htons(PORT);
hp = gethostbyname(destination);
if (hp == NULL) {
printf("不正な名前です\n");
return(-1);
}
//bcopy(hp->h_addr, &dstAddr.sin_addr,
hp->h_length);
memcpy(&dstAddr.sin_addr, hp->h_addr,
hp->h_length);
for(loopCnt=0;loopCnt<loopMax;loopCnt++) {
dstSocket = connect2(&dstAddr,
sizeof(dstAddr));
printf("dstSocket=%d\n",dstSocket);
if (dstSocket < 0) {
printf("%s
に接続できませんでした\n",destination);
return(-1);
}
printf("%s に接続しました\n",destination);
if (start_time == 0) time(
&start_time );
memset(buf,0,sizeof(buf));
sprintf(buf,"data from raspberry
%05d",number);
number++;
printf("Send=[%s]",buf);
//パケットの送信
write(dstSocket, buf, strlen(buf));
//パケットの受信
memset(buf,0,sizeof(buf));
numrcv = read(dstSocket, buf, 1024);
printf("→Recv=[%s]\n",buf);
close(dstSocket);
sleep(5);
} // end for
time( &end_time );
dtime=difftime( end_time, start_time );
printf("loop=%d difftime=%f[sec] %f[min]
retry=%d\n",loopMax,dtime,dtime/60,retryTotal);
return(0);
} |