2017-11-03 36 views
1

리눅스 커널 소스 코드 (net/socket.c 파일)에서 connect() 함수를 조작 중이며 설정된 연결의 소스 및 대상 포트를 가져와야합니다. 함수는 으로 캐스팅하여 이미 대상 포트를 가져올 수있는 struct sockaddr __user* uservaddr 매개 변수를 사용합니다. 그러나 로컬 소스 포트는 어디에 저장되어 있습니까? 이 함수는 또한 필요한 데이터가 들어있는 struct socket* sock을 선언하지만 소스 포트에서 변수를 찾을 수 없습니다. 어떤 도움이 필요합니까?리눅스 커널 공간에서 소켓 connect()에서 로컬 소스 포트를 얻는 방법?

답변

0

짧은 대답 : 소스 및 대상 포트는 struct inet_sock에서 찾을 수 있습니다. 당신은 연결 사용에서 액세스 할 수 있습니다

inet = inet_sk(sock->sock) 

자세한 내용 : 구조체 proto_ops에 정의 된 소켓에 허용 동작.

int tcp_v4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len) 
{ 
     struct sockaddr_in *usin = (struct sockaddr_in *)uaddr; 
     struct inet_sock *inet = inet_sk(sk); 

이상 : :

struct proto tcp_prot = { 
     ... 
     .connect    = tcp_v4_connect, 
(순/IPv4의 /있는 tcp_ipv4.c에서) TCP에 대한 연결() 함수에 대한 구현을 수행하면이 tcp_v4_connect()에 의해 구현됩니다 볼 수 있습니다

inet-> inet_sport 및 inet-> inet_dport는 위의 기능에서 소스 및 대상 포트를 설정/가져 오는 데 사용됩니다.

빠른보기에서 이미 inet_sock이 socket.c에서 사용 된 것을 볼 수 있으므로 추가 헤더 파일을 포함 할 필요가 없습니다.

희망이 도움이됩니다.