| 
 | 
 
在两台虚拟机上用原始套接字进行通讯,两台虚拟机可以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的数据包,请帮忙看看程序有什么问题 |   
 
 
 
 |