`
Iam42
  • 浏览: 275480 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

让虚拟机之间产生流量--关于DCN优化的碎碎念2

阅读更多

     在虚拟交换环境搭建完成之后,我们计划对sFlow监控虚拟交换流量进行实验,这就需要首先在两个虚拟机之间制造流量,我自己两段linux c的socket通信程序,基于UDP,让client向server发送数据包,直到我们按下任意字母键时停止。

命令的使用方式是:

                  client端:client.out serverIP serverPORT

                  server端:server.out serverPORT

     按任意键发送停止的功能是使用一个 在linux下模拟windows下的kbhit函数实现的,具体代码如下:

 

server端:

#include <stdio.h>  
#include <sys/types.h>  
#include <sys/socket.h>  
#include <netinet/in.h>  
#include <arpa/inet.h>  
#include <stdlib.h>

#define MAXBUF 100
      
int main(int argc, char *argv[])  
{  
	int server_sockfd;  
        int len;  
        struct sockaddr_in my_addr;   //服务器网络地址结构体  
        struct sockaddr_in remote_addr; //客户端网络地址结构体  
        int sin_size;  
        char buf[MAXBUF];  //数据传送的缓冲区  
        memset(&my_addr,0,sizeof(my_addr)); //数据初始化--清零  
        my_addr.sin_family=AF_INET; //设置为IP通信  
        my_addr.sin_addr.s_addr=INADDR_ANY;//服务器IP地址--允许连接到所有本地地址上  
        my_addr.sin_port=htons(atoi(argv[1])); //服务器端口号  
            
        if((server_sockfd=socket(PF_INET,SOCK_DGRAM,0))<0)  
        {    
            perror("socket");  
            return 1;  
        }  
        
        if (bind(server_sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr))<0)  
        {  
            perror("bind");  
            return 1;  
        }  
        sin_size=sizeof(struct sockaddr_in);    
          
        /*接收客户端的数据并将其发送给客户端*/
	printf("connecting...");
	while(1){  
        	if((len=recvfrom(server_sockfd,buf,BUFSIZ,0,(struct sockaddr *)&remote_addr,&sin_size))<0)         		 {  
            			perror("recvfrom");   
            			return 1;  
       		        }    
        	buf[len]='\0';  
		if(strcmp(buf,"eof")==0) break;
	}
	printf("miss connecting...\n");  
        close(server_sockfd);  
            return 0;  
    }  

 client端:

#include <stdio.h>  
#include <sys/types.h>  
#include <sys/socket.h>  
#include <netinet/in.h>  
#include <arpa/inet.h>
#include <termios.h>  
#include <unistd.h>  
#include <fcntl.h>   
#include <stdlib.h>

#define MAXBUF 100

int kbhit(void);  /*在linux中实现类似windows中kbhit功能的函数,实现不等待输入*/
      
int main(int argc, char *argv[]) 	
{  
	int client_sockfd;  
        int len;  
        struct sockaddr_in remote_addr; //服务器端网络地址结构体  
        int sin_size;  
        char buf[MAXBUF];  //数据传送的缓冲区  
        memset(&remote_addr,0,sizeof(remote_addr)); //数据初始化--清零  
        remote_addr.sin_family=AF_INET; //设置为IP通信  
        remote_addr.sin_addr.s_addr=inet_addr(argv[1]);//服务器IP地址  
        remote_addr.sin_port=htons(atoi(argv[2])); //服务器端口号  
      
        if((client_sockfd=socket(PF_INET,SOCK_DGRAM,0))<0)  
        {    
            perror("socket");  
            return 1;  
        }  
        strcpy(buf,"keep connecting\n");    
        sin_size=sizeof(struct sockaddr_in);  
          
        /*向服务器发送数据包*/
	printf("connecting...\n");
	while(!kbhit()){  
        	if((len=sendto(client_sockfd,buf,strlen(buf),0,(struct sockaddr *)&remote_addr,sizeof(struct sockaddr)))<0)  
        	{  
            		perror("recvfrom");   
            		return 1;  
        	}
		if(printf("cut '%c'\n",getchar())) break;
	}
	strcpy(buf,"eof");
	printf("%s\n",buf);
	sendto(client_sockfd,buf,strlen(buf),0,(struct sockaddr *)&remote_addr,sizeof(struct sockaddr));
	printf("miss connectng...\n");
        close(client_sockfd);  
        return 0;  
    }


int kbhit(void)  
{  
  struct termios oldt, newt;  
  int ch;  
  int oldf;  
  tcgetattr(STDIN_FILENO, &oldt);  
  newt = oldt;  
  newt.c_lflag &= ~(ICANON | ECHO);  
  tcsetattr(STDIN_FILENO, TCSANOW, &newt);  
  oldf = fcntl(STDIN_FILENO, F_GETFL, 0);  
  fcntl(STDIN_FILENO, F_SETFL, oldf | O_NONBLOCK);  
  ch = getchar();  
  tcsetattr(STDIN_FILENO, TCSANOW, &oldt);  
  fcntl(STDIN_FILENO, F_SETFL, oldf);  
  if(ch != EOF)  
  {  
    ungetc(ch, stdin);  
    return 1;  
  }  
  return 0;  
}  

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics