소켓 사용 시 주의 사항

소켓 int 소켓 만 들 기(int domain,int type,int protocol);sockfd(소켓 주소 설명자)domain 을 주소 족 으로 되 돌려 줍 니 다.보통 PFINET  인터넷 프로 토 콜(네트워크 주소 프로 토 콜)PFUNIX  유 닉 스 인터넷 프로 토 콜(로 컬 주소 프로 토 콜)PFNS  Xerox NS 프로 토 콜 PFIMPLINK 인터페이스 메시지 프로 토 콜 type 소켓 형식 SOCKSTREAM  스 트림 소켓 SOCKDGRAM  데이터 신문 소켓 SOCKRAW   원본 소켓 protocol 인 자 는 보통 0(원본 소켓 사용 시 주의해 야 함)bid(int sockfd,struct sockaddr*addr,int addrlen)로 설정 합 니 다.로 컬 주소 와 포트 를 연결 하 는 것 은 주로 struct sockadd 라 는 구조 체 를 말 합 니 다.이것 은 일반적인 주소 구조 struct sockaddr{입 니 다.        u_short sa_family;//주소 족,PFXXX         char sa_data[14];//14 바이트 프로 토 콜 주소};실제 사용 에 서 는 IP 와 포트 정 보 를 일반 주소 로 직접 전달 하거나 연결 하지 않 습 니 다.struct sockaddr 를 인터넷 프로 토 콜 주소 구조 로 저장 합 니 다.in {          u_short sin_family;//주소 족,PFINET,2 bytes          u_short sin_port;//포트,2 bytes         struct in_addr sin_addr;//IPV 4 주소 4bytes         char sin_zero[8];          //8 bytes unused,충전 으로 이 종 류 를 struct sockaddr 로 강제 전환 하려 면 16 바이트 가 필요 합 니 다};그 중 struct inaddr  {           in_addr_t s_addr;            //u32 network address }; 그 다음 에 이 유형 을 struct sockaddr*유형 으로 강제 전환 하고 IP 주소 가 점 10 진법 에서 u32 네트워크 주소 unsigned long inet 로 어떻게 전환 하 는 지 에 대해 서도 언급 합 니 다.addr(char *address); struct in_addr addr; addr.s_addr = inet_addr("192.168.1.100"); U32 네트워크 주 소 를 char*char*inet 로 변환 합 니 다.ntoa(struct in_addr address); 포트 의 전환 은 바이트 순서 와 관련 되 어야 합 니 다.CPU 가 다른 호스트 에서 메모리 에 다 중 바이트 정수 순 서 를 저장 하 는 두 가지 방법 이 있 기 때문에 호스트 바이트 순서(HBO)라 고 합 니 다.작은 순서,낮은 순서 바이트 는 낮은 주소 에 저 장 됩 니 다.시작 주소 에 저 바이트 저장.intel,AMD 의 큰 순서:높 은 순서 바이트 가 낮은 주소 에 저 장 됩 니 다.시작 주소 에 높 은 바이트 저장.ARM,Motorola,네트워크 에서 전 송 된 데 이 터 는 반드시 네트워크 바이트 순서,즉 엔 드 바이트 순서(NBO)에 따라 야 하기 때문에 대부분의 PC 기기 에서 응용 프로 세 스 가 정 수 를 socket 에 보 내기 전에 네트워크 바이트 순서 로 전환 해 야 합 니 다.응용 프로 세 스 가 socket 에서 정 수 를 꺼 낸 후에 작은 바이트 순서 로 바 꿔 야 합 니 다.호스트 바이트 에서 네트워크 바이트 순서 로 전환 하 는 함수:ulong htonl(u_long hostlong); u_short htons(u_short short); 네트워크 바이트 에서 호스트 바이트 순서 ulong ntohl(u_long hostlong); u_short ntohs(u_short short); 문자열 을 성형 으로 바 꾸 고 atoi 함수 도 사용 합 니 다.
이 를 통 해 IP 주 소 는 바이트 순 서 를 바 꿀 필요 가 없 는 이 유 를 물 어 볼 수도 있 습 니 다.이것 은 inet 때 문 입 니 다.addr 함수 자체 가 바이트 순 서 를 바 꾸 었 고 inetntoa 도 문자열 로 바 뀔 때 네트워크 바이트 순 서 를 이 컴퓨터 바이트 순서 로 바 꿉 니 다.
에 대하 여u32 와 ip 주소 의 변환 문제:
static unsigned char *ip_address = "\xC0\xA8\x00\x01";
if(sock_buff->nh.iph->saddr == *(unsigned int*)ip_address){ return NF_DROP; }
sock_buff->nh.iph->saddr 
예u32 타 입의.10 진 ip 주 소 를 unsigned 로 변환 할 때 char*저장 소.그리고(unsigned int* )강제 전환.


좋은 웹페이지 즐겨찾기