bayern 发表于 2009-5-8 18:20:44

使用SOCK_RAW进行通讯的问题

在两台虚拟机上用原始套接字进行通讯,两台虚拟机可以ping通 server地址为192.168.0.2   client地址为192.168.0.3server与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;
      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;
       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机下
# ./server
socket success! sockrecv = 3
waiting for data from sender...

client机下
# ./client 192.168.0.2
send count = 1
send count = 2
send count = 3
send count = 4
#
server收不到client的数据包,请帮忙看看程序有什么问题
页: [1]
查看完整版本: 使用SOCK_RAW进行通讯的问题