在虚拟交换环境搭建完成之后,我们计划对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;
}
分享到:
相关推荐
VMware虚拟机搭建Ubuntu--超详细,VMware虚拟机搭建Ubuntu--超详细,VMware虚拟机搭建Ubuntu--超详细,VMware虚拟机搭建Ubuntu--超详细,VMware虚拟机搭建Ubuntu--超详细,VMware虚拟机搭建Ubuntu--超详细,VMware虚拟机...
最好用的虚拟机软件----VMware详细图文教程[汇编].pdf
虚拟机原理ver2-CD 虚拟机原理ver2-CD虚拟机原理ver2-CD
虚拟机VirtualBox-4.1.6-74713-Win
Java虚拟机----类的加载过程.docx
虚拟机VirtualBox-4.1.2-73507-Win 另外还有对应的扩展包
最好用的虚拟机软件----VMware详细图文教程分享.pdf
最好用的虚拟机软件----VMware详细图文教程汇编.pdf
虚拟机全攻略⑥---虚拟机安装windows7之安装教程2,虚拟机目前虽然没有普遍使用,却是发展前景非常好,非常实用的好东西,刚才那个发错了,抱歉
最好用的虚拟机软件----VMware详细图文教程终稿.pdf
虚拟机VirtualBox-7.0.4-154605-Win
2015-09-12-Java虚拟机详解----JVM常见问题总结。 博客链接:http://www.cnblogs.com/smyhvae/p/4810168.html
本人亲测OK没问题 。202303实测。很好用的虚拟机VirtualBox-7.0.6-155176-Win-Win Oracle VM VirtualBox
Java虚拟机详解04----GC算法和种类【重要】,有助于更深入理解记忆,文字配图片,10分钟让你记住gc工作机制。
win7的虚拟机安装linux--Redhat
51虚拟机_1.3.1.3.03-64cnfn.apk51虚拟机_1.3.1.3.03-64cnfn.apk
网络上没有一篇文章是如此详细描述了安装MAC虚拟机到Delphi XE进行IOS开发的 MAC虚拟机安装 ----> MAC系统升级 ---->VMWare Tools安装 ---->获取证书 ---->加载开发者设备 ---->下载安装XCode ---->Delphi XE...
虚拟机\VMware-workstation-5.5.3-34685汉化很好用的软件 希望大家喜欢···