>

내가 유지 관리하는 VB6 응용 프로그램에서 수행해야 할 일은 다음과 같습니다.

<올>
  • 이더넷을 통해 알려진 주소 및 포트에 연결 설정 회로망.
  • 요청 보내기

  • 응답을 기다립니다.

  • WinSock 및 Winsock 대체를 사용해 보았지만 다양한 Windows 응용 프로그램에 내재 된 메시징 루프를 어떤 형태로든 다른 형태로 의존합니다. VB6 (또는 다른 언어)에서 위 알고리즘을 구현하는 방법에 대해서는 Winsock API에 대해 잘 모릅니다.

    내 응용 프로그램은 전용 이더넷 네트워크를 통해 금속 절단기를 제어하는 ​​VB6 CAD/CAM 소프트웨어입니다. 이 소프트웨어는 20 년 동안 유지 관리되었으며 다양한 유형의 모션 컨트롤러를위한 여러 드라이버를 개발했습니다. 현재까지 이러한 모션 컨트롤러의 API는

    <올>
  • 하드웨어 연결 열기
  • 하드웨어로 요청 전송 (예 : 축 위치)
  • 응답 대기 중 (보통 밀리 초 단위)
  • 이 컨트롤러 중 일부는 이더넷 네트워크를 통해 작동하지만 지금까지는 포트와 직접 상호 작용할 필요가 없었습니다. 회사에서 제공 한 라이브러리를 사용하여 사물을 처리했습니다. 또한 위에서 언급 한 방식으로 작동하며 정의 된 시간 내에 응답이 발생하지 않으면 시간 초과 오류가 발생합니다.

    Winsock의 문제점은 DoEvents를 삽입하여 응답해야한다는 것입니다. 이로 인해 VB6 애플리케이션에서 멀티 태스킹을 처리하는 방식에 혼란이 발생합니다. CSocketMaster와 같은 대체품은 우리의 멀티 태스킹을 방해하는 서브 클래 싱을 사용합니다.

    따라서 위에서 설명한대로해야 할 일을 할 수있는 Winsock API 또는 타사 dll을 사용하는 방법에 대한 도움이 필요합니다. 다른 모션 컨트롤이 내가 원하는 것을하는 것을 보지 못했는지 묻지 않을 것입니다.


    • 답변 # 1

      와이즈 비즈

      VB6 + Winsock이 제대로 작동하지 않으면 .NET에서이를 작성하여 VB6 프로그램의 COM 표시 DLL로 작성하면 비용이 절감됩니다.

      아래 예제는 당신을 시작할 것입니다. 가끔 이보다 더 많은 전화를 걸면 각 전화의 연결이 열리고 닫힐 때 속도가 느려집니다. PC와 컨트롤러 사이의 앞뒤 통신을 위해 열린 연결을 재사용 할 수 있도록 쉽게 확장 할 수 있어야합니다. 메모리 누수가 발생하지 않도록주의하십시오!

      I think it is rare for it to be appropriate to do networking synchronously, however this isn't networking in the traditional sense. This is a wire from a PC to a controller. This is like a string between two cans. In this case with a large old program, the most appropriate approach is the one that works the best and is the easiest to maintenance.< /end2cents >

      /// <summary> /// Sends a message to the specified host:port, and waits for a response /// </summary> public string SendAndReceive(string host, int port, string messageToSend, int millisecondTimeout) { try { using (var client = new TcpClient()) { client.SendTimeout = client.ReceiveTimeout = millisecondTimeout; // Perform connection client.Connect(host, port); if (client.Connected) { using (var stream = client.GetStream()) { // Convert the message to a byte array var toSend = Encoding.ASCII.GetBytes(messageToSend); // Send the message stream.Write(toSend, 0, toSend.Length); // Get a response var response = new byte[client.ReceiveBufferSize]; stream.Read(response, 0, client.ReceiveBufferSize); return Encoding.ASCII.GetString(retVal); } } else { return null; } } } catch { return null; } }

  • 이전 python 3.x - 소켓 서버에 연결된 두 클라이언트간에 메시지를 교환하려면 어떻게해야합니까?
  • 다음 android - 프래그먼트 내부의 Kotlin 버튼 onClickListener 이벤트