2012-06-14 6 views
0

У меня проблема с этой строкой кода. Я должен взять пакет в порт и повторно отправить на интерфейс (например: eth0). Моя программа успешно принять пакет из порта, но когда я повторно (с send()) интерфейсом У меня есть ошибка:
посыла: недопустимый аргументотправить: неверный аргумент

Линия код:

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

любитель - это пакет, который я беру из порта! Где ошибка?

+0

Я думаю, что вы, возможно, потребуется предоставить немного больше информации и код здесь – mathematician1975

+0

@ mathematician1975 я редактировать! – user1307697

+0

Уверены ли, что sock2 действительно? – Whoami

ответ

3

Вы не вызывали connect() на свой UDP-сокет, поэтому у него нет назначения по умолчанию (которое должно использоваться send()). либо вызовите connect(), чтобы установить назначение по умолчанию, или используйте sendto с явным адресом назначения.

Вы должны также не посылать больше, чем вы на самом деле получил (то есть. packet_length)

+0

connect - это комментарий ... i didn Назовите это .... – user1307697