C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[25300] select / fd_set 사용한건데 틀린부분이 있나요?? 고수님덜 함 봐주셈..
Builder MySelf : [] 1269 읽음    2003-04-21 14:34
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include <stdio.h>
#include "WinSock2.h"
#include <conio.h>
//---------------------------------------------------------------------------
bool AcceptClient(int main_sock);

#pragma argsused
int main(int argc, char* argv[])
{
#if defined (__DEBUG)
    if (argc != 3)
        printf("argc error\n");
#endif

#if defined (__DEBUG)
    char const *ip = argv[1];
    int port = atoi(argv[2]);
#else
    char const *ip = "211.52.8.153";
    int port = 6176;
#endif

    int err_check;

    DWORD sockver = MAKEWORD(2, 0);
    WSADATA sockdata;
    err_check = WSAStartup(sockver, &sockdata);

    if (err_check)
    {
        if (err_check == WSASYSNOTREADY)
            ShowMessage("WSASYSNOTREADY");
        else if (err_check == WSAVERNOTSUPPORTED)
            ShowMessage("WSAVERNOTSUPPORTED");
        else if (err_check == WSAEINPROGRESS)
            ShowMessage("WSAEINPROGRESS");
        else if (err_check == WSAEPROCLIM)
            ShowMessage("WSAEPROCLIM");
        else if (err_check == WSAEFAULT)
            ShowMessage("WSAEFAULT");
        else
            ShowMessage("I don't know what error occured");

        WSACleanup();
        return 0;
    }

    int loop_socket = 0;
    sockaddr_in this_addr;

    loop_socket = socket(AF_INET, SOCK_STREAM, 0);
    if (loop_socket == SOCKET_ERROR)
    {
        printf("socket error\n");
        WSACleanup();
        getch();

        return 0;
    }

    this_addr.sin_family = AF_INET;
    this_addr.sin_port   = htons(port);
    this_addr.sin_addr.S_un.S_addr = inet_addr(ip);
    memset(this_addr.sin_zero, 0, 8);

    err_check = bind(loop_socket, (struct sockaddr*)&this_addr, sizeof(struct sockaddr));
    if (err_check == SOCKET_ERROR)
    {
        printf("bind error\n");
        closesocket(loop_socket);
        WSACleanup();
        getch();

        return 0;
    }

    err_check = listen(loop_socket, SOMAXCONN);
    if (err_check == SOCKET_ERROR)
    {
        printf("listen error\n");
        closesocket(loop_socket);
        WSACleanup();
        getch();

        return 0;
    }

    timeval tv;
    fd_set readfds, writefds;

    tv.tv_sec = 100;
    tv.tv_usec = 0;

    while (1)
    {
        FD_ZERO(&readfds);
        FD_SET(loop_socket, &readfds);

        err_check = select(0, &readfds, NULL, NULL, &tv);

        if (err_check < 0)
        {
            printf("select error\n");
            closesocket(loop_socket);
            WSACleanup();
            break;
        }
        else if (err_check == 0)
        {
            printf("time out\n");
            break;
        }
        else
        {
            if (FD_ISSET(loop_socket, &readfds))
            {
                if (AcceptClient(loop_socket))
                    printf("#####################\n");
                else
                    printf("@@@@@@@@@@@@@@@@@@@@@\n");
            }
        }
    }

    getch();
   
    return 0;
}
//---------------------------------------------------------------------------

bool AcceptClient(int main_sock)
{
    sockaddr_in there_addr;
    int dup_socket, err_check = 0;
    char *buffer = new char[64];

    timeval tv;
    fd_set readfds, writefds;

    tv.tv_sec = 10;
    tv.tv_usec = 0;

    int size = sizeof(sockaddr_in);
    dup_socket = accept(main_sock, (sockaddr*)&there_addr, &size);
    if (dup_socket == SOCKET_ERROR)
    {
        printf("accept error\n");
        closesocket(main_sock);
        WSACleanup();
        getch();
        return false;
    }

    while(1)
    {
        memset(buffer, 0, sizeof(buffer));

        FD_ZERO(&readfds);
        FD_ZERO(&writefds);
        FD_SET(dup_socket, &readfds);
        FD_SET(dup_socket, &writefds);

        err_check = select(0, &readfds, &writefds, NULL, &tv);
        if (err_check < 0)
        {
            printf("select error\n");
            closesocket(dup_socket);
            closesocket(main_sock);
            WSACleanup();
            return false;
        }
        else if (err_check == 0)
        {
            printf("time out\n");
            return false;
        }
        else
        {
            if (FD_ISSET(dup_socket, &readfds))
            {
                int count = recv(dup_socket, buffer, strlen(buffer), MSG_PEEK);
                if (count <= 0)
                    return false;

                printf("%s\n", buffer);
            }
            else if (FD_ISSET(dup_socket, &writefds))
            {
                scanf("%s", buffer);
                send(dup_socket, buffer, strlen(buffer), MSG_DONTROUTE);
                printf("%s\n", buffer);
            }
        }
    }

    delete [] buffer;

    return true;
}
//---------------------------------------------------------------------------

+ -

관련 글 리스트
25300 select / fd_set 사용한건데 틀린부분이 있나요?? 고수님덜 함 봐주셈.. Builder MySelf : 1269 2003/04/21
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.