[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