0

このコード行に問題があります。ポートにパケットを取り、インターフェイス (例: eth0) に再送信する必要があります。私のプログラムはポートからパケットを正常に取得しましたが、send()インターフェイスに (を使用して) 再送信するとエラーが発生しました:
send:Invalid argument

コード行は次のとおりです。

    sock1=socket(AF_INET6,SOCK_DGRAM,0);
    sock2=socket(AF_INET6,SOCK_DGRAM,0);
    fd=fopen("port.txt","r+");
    if(fd) {
    while(!feof(fd)){
    fscanf(fd,"%d",&port);
    fscanf(fd, "%s",interface);
    }
}

memset(&source_addr,0,sizeof(struct sockaddr_in6));
source_addr.sin6_family=AF_INET6;
source_addr.sin6_port=htons(port);
source_addr.sin6_addr=in6addr_any;



if(bind(sock1,(struct sockaddr*)&source_addr,sizeof(struct sockaddr_in6))==-1){perror("bind");}
//if(connect(sock1,(struct sockaddr*)&source_addr,sizeof(struct sockaddr_in6))==-1){perror("connect");}


//Device dove inviare
memset(&freq,0,sizeof(struct ifreq));
strncpy(freq.ifr_name,interface,IFNAMSIZ);

if(ioctl(sock2,SIOCGIFINDEX,&freq)==-1){perror("ioctl");}
 memset(&destination_addr,0,sizeof(struct sockaddr_in6));
 destination_addr.sin6_family=AF_INET6:
 destination_addr.sin6_scope_id=htonl(2)      
 inet_pton(AF_INET6,"2001::620:40b:555:110",(void*)&destination_addr.sin6_addr.s6_addr);
 if(bind(sock2,(struct sockaddr*)&destination_addr,sizeof(struct sockaddr_in6)==-1)
 {perror("bind");}


if((buff=malloc(BUFFER_LENGTH))==NULL){ perror("malloc");}

packet_length=recv(sock1,buff,BUFFER_LENGTH,0);

if(packet_length<0){perror("recv");}

printf("La lunghezza è %d\n",packet_length);

packet=(unsigned char*)buff;

Sniffer(packet,packet_length,' ');


packet_length2=send(sock2,buff,BUFFER_LENGTH,0);

buffはポートから取るパケットです! エラーはどこにありますか?

4

1 に答える 1

3

UDP ソケットを呼び出しconnect()ていないため、デフォルトの宛先がありません (によって使用されますsend())。呼び出しconnect()てデフォルトの宛先を設定するかsendto、明示的な宛先とともに使用します。

また、実際に受け取った以上のものを送信するべきではありません (つまりpacket_length) 。

于 2012-06-14T12:30:53.623 に答える