读书人

linux虚拟机udp环回通讯实验

发布时间: 2013-02-24 17:58:56 作者: rapoo

linux虚拟机udp环回通信实验
我想在虚拟机linux中做一个udp通信的实验,在虚拟机客户端中发送某一数字A,服务器程序接收到A,就求取阶乘并发回给客户端程序。
客户端和服务器都是虚拟机下的linux。虚拟机我选用NAT联网方式。

虚拟机的ip:192.168.10.140,如下ifconfig

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.10.140 netmask 255.255.255.0 broadcast 192.168.10.255
inet6 fe80::20c:29ff:fe9c:bbb3 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:9c:bb:b3 txqueuelen 1000 (Ethernet)
RX packets 838 bytes 77159 (75.3 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 287 bytes 24226 (23.6 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
device interrupt 19 base 0x2024

lo: flags=73<UP,LOOPBACK,RUNNING> mtu 16436
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 0 (Local Loopback)
RX packets 57 bytes 4884 (4.7 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 57 bytes 4884 (4.7 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

virbr0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 192.168.122.1 netmask 255.255.255.0 broadcast 192.168.122.255
ether 52:18:bf:00:ed:f9 txqueuelen 0 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0


客户端程序为
#include<stdio.h>

#include<sys/socket.h>

#include<errno.h>

#include<netdb.h>

#include<netinet/in.h>

#include<arpa/inet.h>

#include<stdlib.h>

#include<string.h>



main(int argc,char *argv[])

{

int n,nSend,len;

int nSocket;

long IResult;

struct sockaddr_in sin;



if(argc != 2)

{

fprintf(stderr,"Usage:%s number\n",argv[0]);

exit(0);

}



nSend = atoi(argv[1]);



if((nSocket = socket(PF_INET,SOCK_DGRAM,0))<0)

{

fprintf(stderr,"socket error:%s\n",strerror(errno));



exit(0);

}



bzero(&sin,sizeof(struct sockaddr_in));



if(inet_pton(AF_INET,"192.168.10.140",&(sin.sin_addr))!=1)

{

fprintf(stderr,"inet_pton error:%s\n",strerror(errno));

exit(0);

}



sin.sin_family=AF_INET;

sin.sin_port=htons(6000);



if(sendto(nSocket,(void *)&nSend,sizeof(int),0,(struct sockaddr *)&sin,sizeof(struct sockaddr_in))<0)

{

fprintf(stderr,"sendto error:%s\n",strerror(errno));

close(nSocket);

exit(0);

}



len=sizeof(struct sockaddr_in);

recvfrom(nSocket,(void *)&IResult,sizeof(long),0,(struct sockaddr *)&sin,&len);



printf("%ld\n",IResult);

close(nSocket);

return;

}



服务器程序:
#include <stdio.h>
#include <sys/socket.h>
#include <error.h>
#include <netdb.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include<stdlib.h>
#include<string.h>

long ComputeFact(int nFact)
{
int n;
long IResult = 1;

if(nFact<0)
return nFact;

if(nFact==0)
return 1;

for(n=1;n<nFact;n++)
{
IResult *= n;
}
return IResult;
}


main()
{
int n,len;
int nRecvVar;
int nSocket;
long ISendVar;
struct sockaddr_in sin,cin;
if((nSocket=socket(PF_INET,SOCK_DGRAM,0))<0)
{
perror("socket");
exit(0);
}
bzero(&sin,sizeof(struct sockaddr_in));
sin.sin_family=AF_INET;
sin.sin_addr.s_addr=htonl(INADDR_ANY);
sin.sin_port=htons(6000);

if(bind(nSocket,(struct sockaddr *)&sin,sizeof(struct sockaddr_in ))<0)
{
perror("bind");
exit(0);
}

for(;;)
{
len=sizeof(struct sockaddr_in);
bzero(&cin,sizeof(struct sockaddr_in));
n=recvfrom(nSocket,(void *)&nRecvVar,sizeof(int),0,(struct sockaddr *)&cin,&len);

if(nRecvVar<0)
break;
}
close(nSocket);
return;
}

但是运行客户端程序和服务器程序,都没有反应。
求大神告知是为什么??? 虚拟机 linux 服务器 socket
[解决办法]
NAT的方式不对 设置为bridge
实际上 你使用NAT方式 如果client 和server不是部署在同一台主机上的话 这2个地址根本不可见
[解决办法]
同一台虚拟机的话是不应该的。
[解决办法]
当然没有反应啦。

服务器的函数的主函数recvfrom后就return了, 然后客户端没有接收到返回,然后...
然后就没有反应了!

读书人网 >UNIXLINUX

热点推荐