UDPのC++
UDPを使いよりbyteの高いものを送る実験ようプログラミング
<client.c>
/*プログラムの説明*/
/*バイト数と送信回数を変更しサーバーにUDPのプロトコルでサーバへデータを送信する。今回のデータはバイト分だけの’a’を送ると言うものである。
を入れその後3を上書きし送信する。最後に10というデータを痩身するというプログラム*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <sys/time.h>
#define DATASIZE 8192 /*バイト数変更するならここ*/
union com{
char v;
int a[4];
};
int main(int argc, char *argv){
int count;
char data [DATASIZE];
int i;
int s;
union com c;
struct sockaddr_in tar;
char ip[64];
unsigned short port;
int len;
int x;
printf("送信先IPアドレスを指定してください\n> ");
scanf("%s", ip);
printf("送信先ポート番号を指定してください\n> ");
scanf("%hd", &port);
/*データに3を格納する。そしてバイト分だけaを入れる。*/
x=3;
for(i=0;i<DATASIZE;i++){
data[i] ='a';
}
c.v = x;
for(i=0 ; i<4;i++){
data[i] =c.a[i];
}
// ソケットオープン
// int socket(int domain, int type, int protocol);
s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
// SOCKADDR_IN 構造体を設定
memset(&tar, 0, sizeof(tar));
tar.sin_family = AF_INET;
tar.sin_addr.s_addr = inet_addr(ip);
tar.sin_port = htons(port);
len = sizeof(tar);
for(i=0;i<1000000;i++) /*ここを変えることで送信回数を変更できる。*/
{
// 送信
// int sendto(int socket, char *buffer, int length, int flags, struct sockaddr *address, int address_len)
sendto(s, data, sizeof(data), 0, (struct sockaddr*)&tar, len);
}
x=10;
c.v=x;
for(i=0;i<4;i++){
data[i] =c.a[i];
}
for(count=0;count<100;count++){
sendto(s, data, sizeof(data), 0, (struct sockaddr*)&tar, len);
}
// ソケット クローズ
// int close(int socket);
close(s);
return 0;
}
<server.c>
/*
クライアントからデータ受け取り3というデータが届いたときだけカウントしそれを元に損失率を出す。
次に10を受信した時点で終了するというプログラムである。
このプログラムでは転送速度と損失率が求められる。
*/
#include<stdio.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <sys/time.h>
#define DATASIZE 8192 //バイト数をクライアントに合わせる。
union com{
int v;
char a[4];
};
int main(int argc, char *argv){
char data[DATASIZE];
int i=0;
union com c;
clock_t c1,c2;
double result;
int count;
int s;
struct sockaddr_in my, tar;
unsigned short port;
unsigned int len;
int x;
double time;
printf("待ちポート番号は?");
scanf("%hd",&port);
// ソケットの準備
s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
memset(&my, 0, sizeof(my));
my.sin_family = AF_INET;
my.sin_port = htons(port);
len = sizeof(tar);
// ソケットとアプリの関連付け
// int bind(int socket, const struct sockaddr *address, socklen_t address_len);
bind(s, (struct sockaddr*)&my, sizeof(my));
memset(&tar, 0, sizeof(tar));
// 受信
// int recvfrom(int socket, char *buffer,
// int length, int flags,
// struct sockaddr *address,
// int *address_length);
// 変数xに受信データを格納
c1 = clock();
while(1){
x=2;
//printf("data:%d",x);
recvfrom(s, data, sizeof(data)-1, 0, (struct sockaddr*)&tar, &len);
for(i=0; i<4;i++){
c.a[i] = data[i];
}
x=c.v;
/*3が届いた時だけカウントする。*/
if(x==3){
count++;
}
/*10が届いた時点で終了する。*/
if(x==10){
c2 = clock();
break;
}
}
// 受信データ参照
printf("IP : %s\n", inet_ntoa(tar.sin_addr));
printf("port : %d\n", ntohs(tar.sin_port));
printf("受信回数:%d\n",count);
result=(double)count/1000000; //result=(double)count/送信回数;
printf("損失率%f\n",(1.0-result)*100);
time = (double) (c2-c1) / CLOCKS_PER_SEC;
printf("経過時間:%f\n",time);
// ソケット クローズ
close(s);
return 0;
}