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); }