프로그래밍 노트

[winsock 초보 프로그래밍] 07 상대방의 IP어드레스 취득 본문

통신관련

[winsock 초보 프로그래밍] 07 상대방의 IP어드레스 취득

띠리 2007. 5. 8. 15:38

서버가 클라이언트의 접속을 기다리다가 클라이언트가 접속 되었을때
어느 클라이언트가 접속 했는지 알아야 할때가 있다.

accept가 되어지면 accept함수의 두번째 파라미터에 상대방에 대한 정보가 저장되어진다.
예제는 accept한 상대방의 IP어드레스와 포트를 표시한다.
(IP어드레스는 문제없이 가져오는데 포트를 제대로 못가져온다. -.-;;; )
(왜 이상한 포트 번호가 넘어오는지 모르겠다. -.-????? )

 


#include <winsock2.h>

#include <stdio.h>


int main()

{

    WSADATA   wsaData;

    SOCKET    sockSvr;

    SOCKET    sockSS;

    int       nlen;

    struct sockaddr_in    addrSockSvr;

    struct sockaddr_in    addrSockclt;


    // 윈속 초기화

    WSAStartup(MAKEWORD(2, 0), &wsaData);


    // 소켓 만들기

    sockSvr = socket(AF_INET, SOCK_STREAM, 0);


    // 소켓 설정

    addrSockSvr.sin_family = AF_INET;

    addrSockSvr.sin_port = htons(333);

    addrSockSvr.sin_addr.S_un.S_addr = INADDR_ANY;

    bind(sockSvr, (struct sockaddr *)&addrSockSvr, sizeof(addrSockSvr));


    // TCP클라이언트로 부터 접속 요구를 대기

    listen(sockSvr, 5);


    while (1) {


        // TCP클라이언트로 부터 접속 요구 받기\tab   

        nlen = sizeof(addrSockclt);

        sockSS = accept(sockSvr, (struct sockaddr *)&addrSockclt, &nlen);


        // 문자송신

        printf("%s 로부터 접속 (포트번호:%d)\n",

                inet_ntoa(addrSockclt.sin_addr),     // IP어드레스

                ntohs(addrSockclt.sin_port));         // 포트번호


        send(sockSS, "안녕", 5, 0);


        closesocket(sockSS);

    }


    // 윈속 종료

    WSACleanup();


    return 0;

}






Comments