免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2741 | 回复: 3
打印 上一主题 下一主题

问几个网络编程的问题? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-06-29 11:57 |只看该作者 |倒序浏览
Linux下面的网络编程写了不少,很多形式的server/client都写过,但是都是应用层的程序,只是机械的调用socket,bind,listen,accept,fork........现在想学习自己控制数据包的接收和发送,看了一些原始套接口的例子,有很多不明白的地方,请有经验的帮忙看看哈:
1、以前只知道socket的第一个参数写AF_INET或者AF_UNIX,第二个是SOCK_STREAM或者SOCK_DGRAM,但是现在看很多程序写法特别多:

  1. sock=socket(AF_INET,SOCK_RAW,255)
  2. sockfd = socket(PF_INET,SOCK_PACKET,htons(ETH_P_ALL))
  3. sd=socket(PF_PACKET,SOCK_RAW,htons(ETH_P_ALL))
复制代码

有些迷惑,看了看UNP上面的讲解,socket第一个参数是协议族,第二个参数是套接口类型,他们之间有对应关系,有一些不匹配,比如AF_UNIX与SOCK_RAW就不匹配。但是上面的例子里面有AF_***和PF_***,他们之间是不是没有区别,UNP上说AF是地址族而PF是协议族,好像在Linux上面是相同的,是不是啊?
2、就是对socket能够处理的层次有些疑惑,是不是sock=socket(AF_INET,SOCK_RAW,255)能够处理到IP层啊,即自己可以控制IP层、传输层的数据接收和发送;而sockfd = socket(AF_INET,SOCK_PACKET,htons(ETH_P_ALL))可以控制到链路层,可以自己控制接收和发送链路层、IP层、传输层的数据。SOCK_RAW和SOCK_PACKET就只有这个区别吗?那SOCK_PACKET所有都能处理,岂不是SOCK_RAW没有必要了?
3、我使用recvfrom接收到数据以后,操作系统是如何处理的,是不是操作系统处理数据的同时只给我的进程发送一份数据的拷贝啊,也就是os向目的进程发送一份同时向原始套接口发送一份拷贝,这里要不要向当前的原始套接口发送主要是看socket的最后一个参数中的协议类型和当前接收到的数据包的协议类型是否相同,如果相同则向其发送拷贝,是不是这样子啊?
噼里啪啦的问了一大堆,主要是自己基础比较差,很多问题搞不清,希望各位给一些指点,先在此谢过大家了!

论坛徽章:
0
2 [报告]
发表于 2006-07-03 10:32 |只看该作者
帮忙顶一下,我也想知道

论坛徽章:
0
3 [报告]
发表于 2006-07-03 11:56 |只看该作者
我这里有个sniffer的例程,你可以看看
里面有用到原始套接字

sniffer.tar.gz

5.09 KB, 下载次数: 112

code

论坛徽章:
0
4 [报告]
发表于 2006-07-03 22:00 |只看该作者

man的结果

Name                Purpose                          Man page
       PF_UNIX, PF_LOCAL   Local communication              unix(7)
       PF_INET             IPv4 Internet protocols          ip(7)
       PF_INET6            IPv6 Internet protocols
       PF_IPX              IPX - Novell protocols
       PF_NETLINK          Kernel user interface device     netlink(7)
       PF_X25              ITU-T X.25 / ISO-8208 protocol   x25(7)
       PF_AX25             Amateur radio AX.25 protocol
       PF_ATMPVC           Access to raw ATM PVCs
       PF_APPLETALK        Appletalk                        ddp(7)
       PF_PACKET           Low level packet interface       packet(7)

       The  socket  has  the indicated type, which specifies the communication
       semantics.  Currently defined types are:

       SOCK_STREAM
              Provides sequenced,  reliable,  two-way,  connection-based  byte
              streams.  An out-of-band data transmission mechanism may be sup-
              ported.

       SOCK_DGRAM
              Supports datagrams (connectionless,  unreliable  messages  of  a
              fixed maximum length).

       SOCK_SEQPACKET
              Provides  a  sequenced,  reliable, two-way connection-based data
              transmission path for datagrams of fixed maximum length; a  con-
              sumer is required to read an entire packet with each read system
              call.

       SOCK_RAW
              Provides raw network protocol access.

       SOCK_RDM
              Provides a reliable  datagram  layer  that  does  not  guarantee
              ordering.

       SOCK_PACKET
              Obsolete  and should not be used in new programs; see packet(7).

       Some socket types may not be implemented by all protocol families;  for
       example, SOCK_SEQPACKET is not implemented for AF_INET.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP