[ds6-devel] why I MUST set a value to scope_id?

guo zhenglin guo364 at oki.com
Tue Aug 19 12:54:05 CEST 2003



1) I use "getaddrinfo" ,
 then socket(), 
then connect()
it return "Inavlid argument" error

2) then I use:
  
((struct sockaddr_in6 *)(res1->ai_addr))->sin6_scope_id =3
 /* 3 is my eth0 index */
 
then connect() is ok ,and send,recv also ok

3) I have test it on linux kernel 2.4.7-10 and 2.4.20
   both linux kernel have this problem.

4) my client program is following:

#include <stdio.h>

#include <sys/socket.h>
#include <sys/types.h>
#include <netdb.h>
#include <errno.h>

int main(void)
{
 int mysock, myerr;
 int  i;
 struct addrinfo hints, *res0, *res1;
 char rcvmsg[100];
 char sndmsg[100];
 int rcvlen;

 memset(&hints, 0, sizeof(hints));
 hints.ai_family = PF_UNSPEC;
 hints.ai_socktype = SOCK_STREAM;

 myerr = getaddrinfo("fe80::210:5cff:fed7:46c6","5001", &hints, &res0);
 if(myerr) return -1;
 
 printf("\n getaddrinfo success");
 
 for(res1 = res0; res1; res1 = res1->ai_next)
 {
  printf("\n--------------------------------");
  printf("\n ai_flags:%d", res1->ai_flags);
  printf("\n ai_family:%d", res1->ai_family);
  printf("\n ai_socktype:%d", res1->ai_socktype);
  printf("\n ai_protocol:%d", res1->ai_protocol);
  printf("\n ai_addrlen:%d",  res1->ai_addrlen);
  printf("\n ai_cannonname:%s", res1->ai_canonname);
  printf("\n ai_next:%p",  res1->ai_next);
  printf("\n ai_addr:");
  for(i=0; i<res1->ai_addrlen; i++)
   printf("%02X ",(*((char *)(res1->ai_addr)+i))&0xFF);
  printf("\n IP:%d", (res1->ai_family==PF_INET6)? 6:4);
  
  printf("\n------------------------------------");
 
  mysock = socket(res1->ai_family, res1->ai_socktype, res1->ai_protocol);
  if(mysock<0){ printf("\n socket fail"); continue;}
  printf("\n socket success");   

  ((struct sockaddr_in6 *)(res1->ai_addr))->sin6_scope_id =3 ;  /* ??? */

  printf("\n connecting...\n");
  if(connect(mysock, res1->ai_addr, res1->ai_addrlen)<0)
  {
   perror("\n connect fail");
   close(mysock);
   continue;
  }
  printf("\n connect succ");
  memset(rcvmsg, 0, 100);
  rcvlen = recv(mysock, rcvmsg, 100, 0);
  printf("\n recvlen:%d", rcvlen);
  printf("\n recvmsg:%s", rcvmsg);
  strcpy(sndmsg, "THIS is a MSG from CLIENT side"); 
  send(mysock, sndmsg, strlen(sndmsg),0);
   
 } 
 close(mysock);
 printf("\n bye \n");

}




More information about the ds6-devel mailing list