- 论坛徽章:
- 0
|
Linux下面的网络编程写了不少,很多形式的server/client都写过,但是都是应用层的程序,只是机械的调用socket,bind,listen,accept,fork........现在想学习自己控制数据包的接收和发送,看了一些原始套接口的例子,有很多不明白的地方,请有经验的帮忙看看哈:
1、以前只知道socket的第一个参数写AF_INET或者AF_UNIX,第二个是SOCK_STREAM或者SOCK_DGRAM,但是现在看很多程序写法特别多:
- sock=socket(AF_INET,SOCK_RAW,255)
- sockfd = socket(PF_INET,SOCK_PACKET,htons(ETH_P_ALL))
- 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的最后一个参数中的协议类型和当前接收到的数据包的协议类型是否相同,如果相同则向其发送拷贝,是不是这样子啊?
噼里啪啦的问了一大堆,主要是自己基础比较差,很多问题搞不清,希望各位给一些指点,先在此谢过大家了! |
|