www.pudn.com > ipv6_send-recv.rar > v6recv.cpp


/*sname_server.c*/ 
#include  
#include  
#include  
#include  
#pragma comment(lib,"WS2_32.lib")//ÒýÈë¿âº¯Êý¡£  
    #define MYPORT 7001    /* the port users will be connecting to */ 
 
    #define BACKLOG 10     /* how many pending connections queue will hold */ 
 
    #define MAXDATASIZE 65635 
 
    main(int argc, char *argv[]) 
    { 
        SOCKET sockfd;  /* listen on sock_fd, new connection on new_fd */ 
        WSADATA wsaData; 
		struct sockaddr_in6 my_addr;    /* my address information */ 
        struct sockaddr *their_addr; 
        int sin_size; 
        int len; 
        int loop = 1; 
         struct hostent *he,*he1; 
        struct ipv6_mreq command; 
        int numbytes; 
        char *buf = (char *) malloc(MAXDATASIZE); 
        long now; 
 
        FILE *wbfp; 
        int i,j; 
        if (WSAStartup(0x0101,&wsaData) != 0){ 
	     fprintf(stderr,"WSAStartup failed: %d\n",GetLastError()); 
		} 
   if((sockfd=socket(AF_INET6,SOCK_DGRAM,IPPROTO_UDP))==INVALID_SOCKET){ 
	fprintf(stderr,"WSAStartup failed: %d\n",GetLastError()); 
  } 
        my_addr.sin6_family = AF_INET6;         /* host byte order */ 
        my_addr.sin6_port = htons(MYPORT);     /* short, network byte order */ 
      //  memset(&my_addr,0,sizeof(my_addr)); 
       // memcpy(&my_addr.sin6_addr,he->h_addr,sizeof(my_addr.sin6_addr)); 
       // my_addr.sin6_addr.s6_addr = INADDR_ANY; /* auto-fill with my IP */ 
        //bzero(&(my_addr.sin_zero), 8);        /* zero the rest of the struct */ 
        memset(&my_addr.sin6_addr,0,sizeof(my_addr.sin6_addr)); 
		my_addr.sin6_addr.s6_addr[0]=1; 
        my_addr.sin6_addr.s6_addr[1]=1; 
        my_addr.sin6_addr.s6_addr[15]=34; 
		printf("%x,%x\n",my_addr.sin6_addr.s6_addr[14],my_addr.sin6_addr.s6_addr[15]); 
         
        if(setsockopt(sockfd,SOL_SOCKET, SO_REUSEADDR,(char *)&loop, sizeof(loop)) < 0){  
            // perror("setsockopt:SO_REUSEADDR");  
               exit(EXIT_FAILURE);  
          }  
 
         
        if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(my_addr)) \ 
                                                                      == -1) { 
           // perror("bind"); 
            exit(1); 
        } 
 
//0303 
       
       i=1;j=1; 
  
//0303 
 
        /* main accept() loop */ 
 
        //    command.imr_multiaddr.s_addr = inet_addr("224.1.2.3");  
            //command.imr_interface.s_addr = htonl(INADDR_ANY);  
             
            command.ipv6mr_interface=0; 
            //memcpy(&command.ipv6mr_multiaddr,he1->h_addr,sizeof(struct in6_addr)); 
             command.ipv6mr_multiaddr.s6_addr[0]=255; 
             command.ipv6mr_multiaddr.s6_addr[1]=48; 
             command.ipv6mr_multiaddr.s6_addr[15]=2; 
			if (setsockopt(sockfd, IPPROTO_IPV6, IPV6_ADD_MEMBERSHIP, (char *)&command, sizeof(command)) < 0){  
          // perror("setsockopt:IP_ADD_MEMBERSHIP");  
           }  
 
             
             
            sin_size = sizeof(struct sockaddr_in6); 
             char file_name[128]; 
 
             unsigned int name_len; 
 
              int namebytes; 
              //if (recvfrom(sockfd, (char *)&name_len, sizeof(unsigned int), 0,(struct sockaddr*)&their_addr,sizeof(their_addr)) == -1) 
		//  perror("recv"); 
	     //    printf("%d\n",name_len); 
	      len=sizeof(struct sockaddr); 
              if ((namebytes= recvfrom(sockfd, file_name, name_len, 0,their_addr,&len)) == -1) 
            //    perror("recv"); 
              file_name[namebytes] = '\0'; 
              printf("\n%d\t%s\n",namebytes,file_name); 
              
              char *des_name = (char*)malloc(128); 
             // strcpy(des_name, "../"); 
 
              printf("\n%s\n",des_name); 
     
              strcat(des_name,file_name); 
	     printf("\n%s\n",des_name); 
             strcpy(des_name, file_name);   
              wbfp = fopen(des_name,"wb+"); 
// 
              if   (wbfp==NULL) { 
                printf("Dest File can't be Create!\n"); 
                return 0; 
              } 
//              now=time_now(); 
        do{ 
              if ((numbytes = recvfrom(sockfd, buf, MAXDATASIZE, 0,their_addr,&len)) == -1) 
         //       perror("recv"); 
 
              buf[numbytes] = '\0'; 
              //printf("Received: %s,%d",buf,numbytes); 
              printf("Received:%d",numbytes); 
              fwrite(buf,1,numbytes,wbfp); 
                
           //   fputs(buf,wbfp); 
         }  while(numbytes>2); 
              free(buf);              
             fclose(wbfp); 
              //close(sockfd); 
              exit(0); 
  }