Q&A

  • 공부삼아 AsyncSocket을 만들어보려고 하는데....
access Violation 에러가 발생합니다. 발생하는 곳은

m_NewEvent := WSACreateEvent;

에서 나옵니다. 아무리 봐도... 맞는것 같은데요.....

아래 소스 첨부했습니다.  00000000 번지를 못

읽으니... 뭔가 생성이 안된것 같은데... 흐미...


<!--CodeS-->
unit pas_Socket;

interface

uses IdWinSock2, Windows;

type
   TAsyncSocket = class
       public
         constructor Create(Host : string; Port : Word);
         procedure Listen;
         procedure Close;
       private
         m_WSADATA : TWSADATA;
         m_hServSock : TSOCKET;
         m_ServAddr : SOCKADDR_IN;

         m_hSockArray : array [0..wsa_maximum_wait_events - 1] of TSOCKET;
         m_hClntSock : TSOCKET;
         m_ClntLen : integer;
         m_ClntAddr : SOCKADDR_IN;

         m_hEventArray : array [0..wsa_maximum_wait_events - 1] of WSAEVENT;
         m_NewEvent : WSAEVENT;
         m_NetEvents : TWSANETWORKEVENTS;

         m_SockTotal : integer;
         m_Index : integer;

         procedure Bind;

   end;

implementation

{ TAsyncSocket }

procedure TAsyncSocket.Bind;
begin
   if IdWinSock2.bind(m_hServSock, @m_ServAddr, SizeOf(m_ServAddr)) = SOCKET_ERROR then
   begin
       Assert(True, 'Bind Error');
       exit;
   end;
end;

procedure TAsyncSocket.Close;
var i : integer;
begin
   for i := 0 to m_SockTotal - 1 do
   begin
       WSACloseEvent(m_hEventArray[i]);
       CloseSocket(m_hSockArray[i]);
   end;
end;

constructor TAsyncSocket.Create(Host : string; Port : Word) ;
begin
   m_SockTotal := 0;

   if (WSAStartup(MAKEWORD(2, 2), m_WsaData) <> 0) then
   begin
       Assert(True, 'WSAStartUp Error');
       exit;
   end;

   m_hServSock := Socket(PF_INET, SOCK_STREAM, 0);
   if (m_hServSock = INVALID_SOCKET) then
   begin
       Assert(True, 'Socket Error');
       exit;
   end;

   m_ServAddr.sin_family := AF_INET;
   m_ServAddr.sin_addr.S_addr := Inet_Addr(pChar(Host));
   m_ServAddr.sin_port := HtoNs(Port);

   Bind;

   m_NewEvent := WSACreateEvent;
   if (WSAEventSelect(m_hServSock, m_NewEvent, FD_ACCEPT) = SOCKET_ERROR) then
   begin
       Assert(True, 'WSACeateEvent Error');
       exit;
   end;
end;

procedure TAsyncSocket.Listen;
begin
   if (IdWinSock2.listen(m_hServSock, 5) = SOCKET_ERROR) then
   begin
       Assert(True, 'Listen Error');
       exit;
   end;

   m_hSockArray[m_SockTotal] := m_hServSock;
   m_hEventArray[m_SockTotal] := m_NewEvent;
   Inc(m_SockTotal);
end;

end.

<!--CodeE-->
3  COMMENTS
  • Profile
    타락천사 2005.07.06 02:30
    안녕하세여. 타락임다..

    코드는 딱히 에러날건 없는거 같은데... 에러가 난다면....

    Create 함수 때문이예요..

    Create 는 아직 클래스가 생성되기 전에 발생해요..

    따라서 아직 채 생성되지 않은 클래스에서 메세지나 이벤트를 주고 받을수 없어요..

    무슨말인지 알겠죠?
  • Profile
    천희택 2005.07.06 05:00
    먼저 Create을 한후에 Active라는 property를 True 하면 CreateEvent하도록

    했습니다. Create을 했으니  객체가 생성되었을 것 같고, 되야 할것 같은데....

    여전히 같은 에러를 발생합니다.... 흐...  밑에 에러메세지도 첨부했습니다...

    비주얼 C++ 닷넷에서는 잘 작동하는 것을 확인하였습니다.... 쩝.. 대충 봐도 같

    은 소스인것 같은데....

    <!--CodeS-->
    unit pas_Socket;

    interface

    uses IdWinSock2, Windows;

    type
       TAsyncSocket = class
           private
             m_WSADATA : TWSADATA;
             m_hServSock : TSOCKET;
             m_ServAddr : SOCKADDR_IN;

             m_hSockArray : array [0..wsa_maximum_wait_events - 1] of TSOCKET;
             m_hClntSock : TSOCKET;
             m_ClntLen : integer;
             m_ClntAddr : SOCKADDR_IN;

             m_hEventArray : array [0..wsa_maximum_wait_events - 1] of WSAEVENT;
             m_NewEvent : WSAEVENT;
             m_NetEvents : TWSANETWORKEVENTS;

             m_SockTotal : integer;
             m_Index : integer;
             m_Active : boolean;

             m_IpAddr : string;
             m_Port : Word;

             procedure Bind;
             procedure Load(Active : Boolean);
           public
             constructor Create(Host : string; Port : Word);
             procedure Listen;
             procedure Close;
             procedure Free;
           property Active : boolean read m_Active write Load;
       end;

    implementation

    { TAsyncSocket }

    procedure TAsyncSocket.Bind;
    begin
       if IdWinSock2.bind(m_hServSock, @m_ServAddr, SizeOf(m_ServAddr)) = SOCKET_ERROR then
       begin
           Assert(True, 'Bind Error');
           exit;
       end;
    end;

    procedure TAsyncSocket.Close;
    var i : integer;
    begin
       for i := 0 to m_SockTotal - 1 do
       begin
           WSACloseEvent(m_hEventArray[i]);
           CloseSocket(m_hSockArray[i]);
       end;
    end;

    constructor TAsyncSocket.Create(Host : string; Port : Word) ;
    begin
       m_SockTotal := 0;

       m_IpAddr := Host;
       m_Port := Port;

       if (WSAStartup(MAKEWORD(2, 2), m_WsaData) <> 0) then
       begin
           Assert(True, 'WSAStartUp Error');
           exit;
       end;

    end;

    procedure TAsyncSocket.Free;
    begin
        WSACleanup;
    end;

    procedure TAsyncSocket.Listen;
    begin
       if (IdWinSock2.listen(m_hServSock, 5) = SOCKET_ERROR) then
       begin
           Assert(True, 'Listen Error');
           exit;
       end;

       m_hSockArray[m_SockTotal] := m_hServSock;
       m_hEventArray[m_SockTotal] := m_NewEvent;
       Inc(m_SockTotal);
    end;

    procedure TAsyncSocket.Load(Active : boolean);
    begin
        if (not m_Active) and (Active) then
        begin
            m_hServSock := Socket(PF_INET, SOCK_STREAM, 0);
            if (m_hServSock = INVALID_SOCKET) then
            begin
                Assert(True, 'Socket Error');
                exit;
            end;

            m_ServAddr.sin_family := AF_INET;
              m_ServAddr.sin_addr.S_addr := Inet_Addr(pChar(m_IpAddr));
            m_ServAddr.sin_port := HtoNs(m_Port);

            Bind;

            m_NewEvent := WSACreateEvent;
            if (WSAEventSelect(m_hServSock, m_NewEvent, FD_ACCEPT) = SOCKET_ERROR) then
            begin
                Assert(True, 'WSACeateEvent Error');
                exit;
            end;
        end
        else if (m_Active) and (not Active) then
        begin
            Close;
        end;


        m_Active := Active;
    end;

    end.
    <!--CodeE-->
  • Profile
    천희택 2005.07.06 19:04
    인터넷에서 구한 WinSock2.pas로 대체하니까 됩니다..

    • 서정길
    • 2005.07.06 02:02
    • 4 COMMENTS
    • /
    • 0 LIKES
    • nilriri™
      2005.07.06 10:52
      간단히 구현가능할줄 알았더니..은근히 ... 리소스 자료실에 간단한 셈플하나 올려두겠습니다 참고하...
    • 서정길
      2005.07.06 20:46
      덕분에 해결했습니다~ ^^ 그런데 TWincontrolForm 은 뭔가요? 폼 젤 위에 있던데... 행복하세요~ ※ 아...
    • nilriri™
      2005.07.08 07:48
      TWincontrolForm 이게 뭘까요? 저도 궁금한데요..ㅡㅡ; 폼 젤위에 있다라??? 도대체 어디지?? ...
    • 하얀까마귀
      2005.07.06 03:59
      안녕하세요 하얀까마귀 입니다. 음.. 퀵은 말씀하신 3단 4단과 같은 리포트는 제대로 지원하지 않습니다...
    • 모영철
      2005.07.06 18:04
      DataBasename을 설정해 주시고.. StoredProcName의 콤보 박스버턴을 클릭하면 프로시져 목록이 나오니 ...
    • 천희택
    • 2005.07.06 00:43
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 타락천사
      2005.07.06 02:30
      안녕하세여. 타락임다.. 코드는 딱히 에러날건 없는거 같은데... 에러가 난다면.... Create 함수 때...
    • 천희택
      2005.07.06 05:00
      먼저 Create을 한후에 Active라는 property를 True 하면 CreateEvent하도록 했습니다. Create을 했으니&...
    • 천희택
      2005.07.06 19:04
      인터넷에서 구한 WinSock2.pas로 대체하니까 됩니다..
    • nilriri™
      2005.07.06 11:18
      레포트를 호출하는 폼에서.. 변수하나 선언하시고 초기화 하시고.. 레포트의 private 영영에도 변수를 ...
    • 김락원
      2005.07.06 19:21
      충실한 답변에 감사드립니다.. ^^ 근데.. 제가 델파이 초짜 이다 보니... 쪼금 이해를 못하는 부분이 있...
    • nilriri™
      2005.07.06 23:14
      이런식의 답변이 님께 해악이 될지도 모르겠지만.. 분석해 보세요.. 말로 설명하기가 어려워서 셈...
    • 김락원
      2005.07.07 22:06
      감사합니다... 덕분에 해결했습니다.. 코드보고.. 더욱 열씨미 공부하겠습니다...
    • 조혜진
    • 2005.07.05 23:33
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 김성원
      2005.07.06 00:35
      참고만 하세여. 파라미터는 ':'콜론 뒤에 파라미터명을 주면 됩니다. 이름은 같아도 되지만 혼돈이 우려되...
    • 조혜진
      2005.07.06 00:39
      감사드립니다 !.
    • 이경범
    • 2005.07.05 23:06
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 모영철
      2005.07.06 18:01
      DDNS 서비스를 해주는 업체에 물어보시면 될것 같은데요. 요즘에도 공짜로 해주는데가 있나 모르겠지만....
    • 이대성
    • 2005.07.05 22:20
    • 0 COMMENTS
    • /
    • 0 LIKES
    • Timeless
    • 2005.07.05 20:18
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2005.07.05 07:06
      안녕하세요. 최용일입니다. Form2 := TForm2.Create(Self); 위에코드는 Form2란 변수에 객체가 생성...
    • 강정구
      2005.07.05 07:36
      너무도 빠른 답변에...놀랬습니다...커피 쏟을뻔 했습니다.... 먼저 친절한 답변에 감사를 드립니다. ...
    • 최용일
      2005.07.05 09:35
      Form2를 쓰든 Form3를 쓰든... 메모리에 생성된 객체를 참조할 땐 변수를 이용합니다. 또한 그 객체를 참조...
    • 강정구
      2005.07.05 10:04
      그 공중에 떠있는걸 찾아야 겠군요..... 친절한 답변에 감사 드립니다..... 건승 하세요.....
    • nilriri™
      2005.07.05 09:34
      이거 말씀하시는건지?? QuickRep1.ShowProgress   속성값 조정해..보세요~
    • 모영철
      2005.07.05 05:22
      pppoe 방식은 IP를 유동으로 받기때문에 netsh로 강제적으로 바꿔주는건 안될테구요.. 이게 유동IP이...
    • henryloy
      2005.07.05 05:48
      먼저 힌트를 주신것에 대해 매우 감사를 드립니다. 말씀하신 폼의 컨트롤를 하는 것은 이미 해봤구요....
    • 박기웅
    • 2005.07.05 03:03
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 모영철
      2005.07.05 05:14
      Navigate 해서 페이지가 다 로딩되면 OnComplete인가? 하는 이벤트가 발생됩니다. 이건 페이지의 프...
    • 문혜윤
    • 2005.07.05 02:29
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 김성진
      2005.07.05 05:52
      스캔한 정보에 대한 정보는 대부분 다 가능합니다. 검은부분의 분포도는 정확히 알 수 있을 지는 모르지만...
    • 문혜윤
      2005.07.07 13:30
      확실히 방향은 안보이지만 부딪혀 보고 걸리는 부분이 있으면 다시 조언 부탁드립니다.......
    • 박찬
    • 2005.07.05 00:11
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 박기웅
    • 2005.07.05 00:06
    • 1 COMMENTS
    • /
    • 0 LIKES
    • nilriri™
      2005.07.05 09:27
      document 객체에서 innerhtml로 로딩된 리소스 문자열을 검사해서. 특정 문자열...비밀번호가 틀렸습...
    • 김세현
    • 2005.07.04 23:32
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 권태훈
      2005.07.05 00:47
      무한대기 상태로 빠져도 프로그램 종료후 232 포트의 사용이 불가능한것은 232 쪽 프로그램에서 뭔가 ...
    • 김세현
      2005.07.07 17:54
      답변 감사 드립니다. 많은 도움이 되었습니다. 말씀하신대로 오라클 서버를 만들고 테스트 해바야 ...
    • 모영철
    • 2005.07.04 23:19
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2005.07.05 07:18
      안녕하세요. 최용일입니다. 길이는 4바이트입니다. 문자열 주소 - 4옵셋 에 길이가 들어 있습니다. S...
    • 김용호
    • 2005.07.04 23:19
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 배정은
    • 2005.07.04 23:10
    • 1 COMMENTS
    • /
    • 0 LIKES
    • nilriri™
      2005.07.05 09:43
      Static Text  라면 caption 속성에 텍스트를 보여주는 역활만 담당하는건가요? 용도를 몰라서...
    • Galaxy
    • 2005.07.04 20:44
    • 0 COMMENTS
    • /
    • 0 LIKES