C ++ TCP 클라이언트 IP를 얻기

#INCLUDE <STDIO.H>
#INCLUDE <stdlib.h>
사용법 #include <string.h>
#INCLUDE <errno.h>
#INCLUDE <SYS / types.h>
#INCLUDE <SYS / socket.h>
#INCLUDE <netinet /in.h>


#DEFINE의 맥스 4096


주 INT (INT의 ARGC 숯불 **는 argv)
{
    INT의 listenfd, connfd;
    구조체를 sockaddr_in servaddr, caddr;
    숯 버프 [4096];
    INT 않음;


    {((listenfd = 소켓 (AF_INET, 0)) == -1 SOCK_STREAM) 경우
    의 printf ( "% S (errno는 : 소켓 생성 오류가 % d) \ n"함수 strerror (errno를)의 errno);
    출구 (0);
    }


    memset 함수 (servaddr, 0는 sizeof (servaddr));
    memset 함수 (caddr, 0는 sizeof (caddr));
    servaddr.
    servaddr.sin_addr.s_addr = htonl (INADDR_ANY);
    servaddr.sin_port = htons (6666);


    
    경우 (바인드 (listenfd (구조체 SOCKADDR의 *) servaddr,는 sizeof (servaddr)) == -1) {
    의 printf ( "결합 소켓 오류 % S (errno를 %의 D) \ n"함수 strerror (errno를)의 errno) ;
    출구 (0);
    }


    {((listenfd 10) == -1 청취)하는 경우
    ( "소켓 에러 청취 % S (errno를 %의 D) \ n"함수 strerror (errno는) errno는)에서 printf;
    출구 (0);
    }


    에서 printf ( "n은 클라이언트의 요청 ====== \ 기다리고 ======");
    (1) {동안
의 socklen_t = 길이를 sizeof (caddr);
    경우 ((connfd = (listenfd (수용 구조체의 SOCKADDR *) caddr, 및 길이)) == -1) {
        의 printf는 ( "소켓 오류를 받아 들일 %의 (errno는 : % d 개)", 함수 strerror (errno를), errno는);
        계속하다;
    }
    N = RECV (connfd, 버프, 맥스, 0);
    버프 [N] = '\ 0';
    의 printf ( "클라이언트에서 RECV의 메시지 : %의 \ n을", 버프);
    의 printf ( "% s의 RECV의 메시지 : 클라이언트 : %의 \ 없음", inet_ntoa (caddr.sin_addr), 버프);
    확대 (connfd);
    }


    확대 (listenfd);
}

 

클라이언트 : 그대로 원래

#INCLUDE <STDIO.H>
#INCLUDE <stdlib.h>
사용법 #include <string.h>
#INCLUDE <errno.h>
#INCLUDE <SYS / types.h>
#INCLUDE <SYS / socket.h>
#INCLUDE <netinet /in.h>


#DEFINE의 맥스 4096


주 INT (INT의 ARGC 숯불 **는 argv)
{
    INT의 sockfd와, N;
    숯 recvline [4096] sendline [4096];
    구조체를 sockaddr_in servaddr;


    (ARGC = 2!) {경우
    의 printf ( "사용 : ./client <IPADDRESS> \ n");
    출구 (0);
    }


    경우 ((sockfd와 = 소켓 (AF_INET, SOCK_STREAM, 0)) <0) {
    의 printf ( "소켓 에러 생성 % S (errno를 %의 D) \ n"을, errno는 함수 strerror (errno는));
    출구 (0);
    }


    memset 함수 (servaddr, 0는 sizeof (servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons (6666);
    경우 (inet_pton (AF_INET,는 argv [1], servaddr.sin_addr) <= 0) {
    의 printf ( "%의 S를 \ n에 대한 inet_pton 오류"는 argv [1]);
    출구 (0);
    }


    {((sockfd와 (구조체 SOCKADDR의 *) servaddr,는 sizeof (servaddr)) <0 연결할) 경우
    ]에서 printf (strerror는 (의 errno) errno는 "%의 D) \ n : % S (errno에 에러 연결")
    출구 (0);
    }


    의 printf는 ( "서버에 MSG를 보내 : \ n을을");
    는 fgets (sendline 4096 표준 입력);
    () sockfd와, sendline, 나 strlen (sendline (0) <0 보낼 있으면)
    {
    (, 함수 strerror (errno는) errno에 "%의 D) \ n : % S (MSG의 errno 에러 보내기")에서 printf

    }


    확대 (sockfd와);
    출구 (0);
}

================================================== ====================================

각 기능 설명 :

소켓, 프로토 타입 :

INT 소켓 ( INT 도메인, INT 유형, INT 프로토콜);

프로토콜 필드 (IPv4를 IPv6를) 소켓 타입 (다른 스트림), 프로토콜 (TCP, UDP)

 

이 조작에 의해 얻어진 디스크립터

파일 기술자 및 수신 포트 바인딩

빙 ( INT의 sockfd와, CONST 구조체 SOCKADDR *의 요지, socklen_t이 addrlen)

우리는 네트워크 소켓, 그래서에 대한 강한 회전, 둘 사이의 차이가 있습니다 :

구조체 SOCKADDR 소켓 주소가 일반적이며, 구조체를 sockaddr_in 인터넷 환경 소켓 주소 형식입니다

전화 예 :

바인딩 (listenfd (구조체의 SOCKADDR *) servaddr,는 sizeof (servaddr))

 

결합 후, 경청하는 것입니다 수락

INT (듣기 INT의 sockfd와, INT 백 로그);
INT 동의 ( INT의 sockfd와, 구조체 SOCKADDR의 * 요지, socklen_t이 * addrlen);

연결의 정의 최대 수는 듣고 듣다

네트워크 정보 서버와 클라이언트 소켓을 결합 수락, 클라이언트는 후속 통신을 처리 반환

클라이언트, 첫째, 소켓을 호출하는 파일 핸들을 얻을, 다음 매개 변수와 핸들을 바인딩 서버가 int로 연결 ( INT의 sockfd와, CONST의 구조체 SOCKADDR의 * 요지,의 socklen_t addrlen)를, 당신은 재미 의사 소통을 할 수 있습니다. 네트워크 호스트 엔디안 바이트 순서가 있음을 참고

네트워크는 빅 엔디안입니다 ~~

 

// ================================================ ================================================== ====================

    헤더 파일을
    Windows에서 :
    사용법 #include <WS2TCPIP.H>
    리눅스에서 :
    사용법 #include <SYS / socket.h>
    사용법 #include <netinet / in.h>
    사용법 #include <ARPA / inet.h>
    의 inet_pton 기능
    소수점 시리얼 변환 네트워크 바이트 순서에 이진 값이 함수는 IPv4와 IPv6 주소 모두를 처리 할 수있다.
    첫 번째 파라미터는 AF_INET6 AF_INET이거나 수
    두번째 파라미터 문자열 소수점 포인터에 대한 포인터이다
    세번째 파라미터는 네트워크 바이트 순서 변환 된 포인트의 이진 값에 대한 포인터이다.
    inet_ntop 기능
    반대로, inet_ntop 기능 inet_pton 및 기능 바이트 순서 소수점 캐릭터 라인을 곳곳에 네트워크 이진 값을 변환하는 것입니다.
    첫 번째 파라미터는 AF_INET 또는 AF_INET6 수있다 :
    두 번째 매개 변수는 바이트 순서 이진 값을 네트워크를 가리키는 포인터이다
    세번째 파라미터 스트링 포인터 변환 소수점 점이다
    네번째 파라미터 대상인 크기는 버퍼를 피하기 위해 그 함수 호출 오버플.
    샘플

#INCLUDE <STDIO.H>
#INCLUDE <stdlib.h>
사용법 #include <string.h>
사용법 #include <unistd.h>
#INCLUDE <SYS / socket.h>
#INCLUDE <netinet / in.h>
INT 본체 (무효)
{
    IPdotdec를 숯불 [20이다]; // 점선 소수의 IP 주소를 저장
    in_addr 구조체들; // IPv4 주소 구조
    // 의 IP 주소를 입력
    ( "IP 주소를 입력하세요 :")에의 printf를,
    scanf와 ( "%의 S", IPdotdec을);
    // 변환
    inet_pton (AF_INET, IPdotdec, (무효 *) & S)
    의 printf ( "inet_pton : 0X % X \ N- "s.s_addr); // 얻어진 주 엔디안
    // 역변환
    inet_ntop (AF_INET (무효 *) S, IPdotdec 16)
    의 printf ("inet_ntop % S \ N- "IPdotdec)
}

 

추천

출처www.cnblogs.com/YZFHKMS-X/p/11761188.html