xiaodan1a
请问一般套接字的绑定和原始套接字的绑定有什么区别吗
谢谢指点:em02: :em11:
xiaodan1a
是的,但是用如下的代码绑定出错啊,麻烦看一下
if ( (sock=socket(PF_PACKET, SOCK_RAW,htons(ETH_P_IP)))<0)
{
//IPPROTO_RAW
perror("socket");
exit(1);
}
/*bind local server port*/
servAddr.sin_family=AF_INET;
servAddr.sin_port=htons(LOCAL_SERVER_PORT);
servAddr.sin_addr.s_addr=inet_addr("192.168.1.119");
bzero(&(servAddr.sin_zero),8);
if(bind(sock,(struct sockaddr *)&servAddr,sizeof(struct sockaddr))==-1)
{perror("bind");
exit(1);
}
错误提示:bind:invalid argument
[[i] 本帖最后由 xiaodan1a 于 2008-5-29 18:45 编辑 [/i]]
yangliu817
原始套接字和数据链路层访问是不一样的,根据楼主提供的code,可能说的是数据链路层访问。
1,发送:
int fd;
struct sockaddr_ll dest;
if ((fd = socket(PF_PACKET, SOCK_DGRAM, htons(ETH_P_IP))) < 0)
{
DEBUG(LOG_ERR, "socket call failed: %s", strerror(errno));
return -1;
}
memset(&dest, 0, sizeof(dest));
dest.sll_family = AF_PACKET;
dest.sll_protocol = htons(ETH_P_IP);
dest.sll_ifindex = ifindex; //发送端接口的index,用ioctl(SIOCGIFINDEX)获得
dest.sll_halen = 6;
memcpy(dest.sll_addr, dest_mac, 6);//接收端接口的mac
if (bind(fd, (struct sockaddr *)&dest, sizeof(struct sockaddr_ll)) < 0)
{
DEBUG(LOG_ERR, "bind call failed: %s", strerror(errno));
close(fd);
return -1;
}
。。。开始组装TCP/UDP数据包packet
result = sendto(fd, &packet, sizeof(packet), 0, (struct sockaddr *) &dest, sizeof(dest));
2,接收
int fd;
struct sockaddr_ll sock;
if ((fd = socket(PF_PACKET, SOCK_DGRAM, htons(ETH_P_IP))) < 0)
{
DEBUG(LOG_ERR, "socket call failed: %s", strerror(errno));
return -1;
}
sock.sll_family = AF_PACKET;
sock.sll_protocol = htons(ETH_P_IP);
sock.sll_ifindex = ifindex;//接收端接口的index,用ioctl(SIOCGIFINDEX)获得
if (bind(fd, (struct sockaddr *) &sock, sizeof(sock)) < 0)
{
DEBUG(LOG_ERR, "bind call failed: %s", strerror(errno));
close(fd);
return -1;
}