GOLDBOOK

C++,Python,プログラミング,IT

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;

}