请问一般套接字的绑定和原始套接字的绑定有什么区别吗

xiaodan1a
请问一般套接字的绑定和原始套接字的绑定有什么区别吗

谢谢指点:em02: :em11:

cjaizss
你是指bind系统调用?基本相同,但原始套接字无端口之说

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]]

xiaodan1a
不知道为什么出现一些头像,那的语法应该没错

longlongxcx
回复 #3 xiaodan1a 的帖子

对于原始套结字是不经过传输层的,你绑定了端口是不是这个地方错了阿。。

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