2013-06-17 3 views
4

UDP와 같이 non-blocking 데이터 그램 소켓에 대해 write()/send()를 호출 할 때 write()/send() 또는 read()/recv() 호출은 정확히 1 패킷을 처리합니다.원시 소켓 데이터 그램 소켓 또는 아닙니다?

원시 소켓이 아래와 같이 데이터 그램 소켓인지 궁금합니다.

int on = 1; 
rawfd = socket(AF_INET, SOCK_RAW, IPPROTO_RAW); 
setsockopt(IPPROTO_IP, IP_HDRINCL, &on, sizeof(on)); 

답변

2

패킷 (TCP 또는 UDP)에 포함시킬 IP 헤더의 종류에 따라 다릅니다. 실제로 커널이 일부 TCP 메커니즘을 관리하기 때문에 UDP 헤더를 포함하는 것이 더 쉽습니다.

패킷에 UDP 헤더를 추가해야하므로 데이터 그램 소켓이됩니다.

+0

원시 소켓이므로 TCP 스택이 포함되지 않습니다. 원시 소켓에 대한 TCP 패킷은 패킷 일 뿐이라고 생각합니다. TCP 메커니즘이 관련되어 있지 않습니다. isn/t it? – user1944267

+0

메커니즘이 관련되어 있습니다. 커널은 TCP 소켓의 경우에 당신을 위해 몇 가지 일을합니다. [이 질문] (http://stackoverflow.com/questions/4323764/can-i-create-a-listening-tcp-socket-using-raw-sockets-in-linux)을보십시오. – nouney

+0

아, ok, recv()/read()입니다. TCP 스택이 들어오는 tcp 패킷을 응답하기 때문입니다. 하지만 send()/write()의 경우 raw socket은 로컬 TCP 스택과 아무 관련이 없습니다. – user1944267

2

데이터를 보낼 때 TCP/IP 스택은 TCP/UDP 헤더, IP 헤더 및 이더넷 헤더를 추가하고 네트워크 워크 카드는 전체 패킷을 전송합니다. Raw 소켓의 경우 모든 헤더 (TCP/UDP, IP 및 MAC)를 준비하고 네트워크 워크 카드는 전체 패킷을 전송합니다. 그래서 당신이 추가하는 헤더에 따라 데이터 그램 여부는 TCP 또는 UDP입니다.