/*
Simple Socket Server
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <time.h>
#include <limits.h>
#include <ctype.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
//待ち受けるポート番号
//クライアントプログラムとポート番号を合わせてください
int PORT = 9876;
int main(int argc, char **argv){
int i;
int srcSocket; //自分
int dstSocket; //相手
// sockaddr_in 構造体
struct sockaddr_in srcAddr;
struct sockaddr_in dstAddr;
socklen_t dstAddrSize;
// 各種パラメータ
int numrcv;
char buf[1024];
int loopMax;
int loopCnt;
time_t start_time=0, end_time;
double dtime;
loopMax=INT_MAX;
if (argc > 1) {
loopMax=atoi(argv[1]);
}
if (argc == 3) {
PORT = atoi(argv[2]);
}
printf("PORT=%d\n",PORT);
// sockaddr_in 構造体のセット
//bzero((char *)&srcAddr, sizeof(srcAddr));
memset((char *)&srcAddr, 0, sizeof(srcAddr));
srcAddr.sin_port = htons(PORT);
srcAddr.sin_family = AF_INET;
srcAddr.sin_addr.s_addr = INADDR_ANY;
// ソケットの生成(ストリーム型)
srcSocket = socket(AF_INET, SOCK_STREAM, 0);
// ソケットのバインド
bind(srcSocket, (struct sockaddr *)&srcAddr,
sizeof(srcAddr));
// 接続の許可
listen(srcSocket, 5);
for(loopCnt=0;loopCnt<loopMax;loopCnt++) {
// 接続の受付け
printf("接続を待っています\nクライアントプログラムを動かして下さい\n");
dstAddrSize = sizeof(dstAddr);
dstSocket = accept(srcSocket, (struct
sockaddr *)&dstAddr, &dstAddrSize);
printf("%s
から接続を受けました\n",inet_ntoa(dstAddr.sin_addr));
if (start_time == 0) time(
&start_time );
while(1) { //
クライアントがSocketをクローズしてからこちらもクローズする
//パケットの受信
memset(buf,0,sizeof(buf));
numrcv = read(dstSocket,
buf, 1024);
printf("numrcv=%d\n",numrcv);
if(numrcv ==0 || numrcv
==-1 ){ // client close socket
close(dstSocket); break;
}
printf("Recv=[%s]",buf);
for (i=0; i< numrcv;
i++){ // bufの中の小文字を大文字に変換
//
if(isalpha(buf[i])) buf[i] = toupper(buf[i]);
if(isalpha(buf[i])) {
if(islower(buf[i])) {
buf[i] = toupper(buf[i]);
}
else {
buf[i] = tolower(buf[i]);
}
}
}
// パケットの送信
write(dstSocket, buf,
numrcv);
printf("->Send=[%s]\n",buf);
} // end while
} // end for
time( &end_time );
dtime=difftime( end_time, start_time );
printf("loop=%d difftime=%f[sec]
%f[min]\n",loopMax,dtime,dtime/60);
return(0);
}
|