|
在两台虚拟机上用原始套接字进行通讯,两台虚拟机可以ping通 server地址为192.168.0.2 client地址为192.168.0.3 server与client程序如下
/*server.c*/
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
main(){
int sockrecv;
char message[10];
struct sockaddr_in recvaddr,sendaddr;
bzero(&recvaddr,sizeof(recvaddr));
recvaddr.sin_family = AF_INET;
recvaddr.sin_addr.s_addr = inet_addr("192.168.0.2");
sendaddr.sin_family = AF_INET;
sendaddr.sin_addr.s_addr = inet_addr("192.168.0.3");
/*create raw socket*/
if((sockrecv=socket(AF_INET,SOCK_RAW,IPPROTO_TCP))== -1){
perror("socket");
exit(1);
}
printf("socket success! sockrecv = %d\n",sockrecv);
printf("waiting for data from sender...\n");
/*bind the socket*/
if(bind(sockrecv,(struct sockaddr *)&recvaddr,sizeof(struct sockaddr))== -1){
perror("bind");
exit(1);
}
/*loop forever*/
while(1){
recvfrom(sockrecv,message,sizeof(message),0,(struct sockaddr *)&sendaddr,sizeof(struct sockaddr));
printf("receive a message : %s\n",message);
if(strncmp(message,"stop",4) == 0){
printf("sender stopped\n");
break;
}
}
close(sockrecv);
}
break;
}
}
close(sockrecv);
}
/*client.c*/
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <sys/socket.h>
main(int argc,char *argv[]){
int socksend,count;
char buf[10];
struct sockaddr_in sendaddr,recvaddr;
bzero(&sendaddr,sizeof(sendaddr));
sendaddr.sin_family=AF_INET;
sendaddr.sin_addr.s_addr=inet_addr("192.168.0.3");
recvaddr.sin_family=AF_INET;
recvaddr.sin_addr.s_addr=inet_addr("192.168.0.2");
if(argc < 2){
printf("please enter the server's IP!\n");
exit(1);
}
/*create raw socket to send message*/
if((socksend=socket(AF_INET,SOCK_RAW,IPPROTO_TCP))== -1){
perror("socket");
exit(1);
}
/*bind the socket*/
if(bind(socksend,(struct sockaddr *)&recvaddr,sizeof(struct addr))== -1){
perror("bind");
exit(1);
}
/*connect to the server socket*/
if(connect(socksend,(struct sockaddr *)&recvaddr,sizeof(struct sockaddr))== -1){
perror("connect");
exit(1);
}
/*send the message*/
for(count=1;count , 5;count++){
sprintf(buf,"data ID%d\n",count);
send(socksend,buf,sizeof(buf),0);
printf("send count = %d\n",count);
}
sprintf(buf,"stop\n");
send(socksend,buf,sizeof(buf),0);
close(socksend);
}
server机下
[root@localhost root]# ./server
socket success! sockrecv = 3
waiting for data from sender...
client机下
[root@localhost root]# ./client 192.168.0.2
send count = 1
send count = 2
send count = 3
send count = 4
[root@localhost root]#
server收不到client的数据包,请帮忙看看程序有什么问题 |
|