在虚拟交换环境搭建完成之后,我们计划对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; }