2011-12-21 7 views
3

레거시 제품의 VB6 WinSock Tcp 클라이언트는 보낸 메시지의 절반을 단순히 "놓칩니다".VB6 WinSock TCP 클라이언트 및 .NET TCP 서버

VB6로 작성된 기존 레거시 응용 프로그램이 C# TCP 서버에 연결해야하는 서버 프로젝트에서 작업하게 될 것입니다.

System.Net.TcpClient 덕분에 두 종단점이 .NET 일 때 TCP 클라이언트/서버 프로그래밍은 항상 쉽습니다. VB6 그룹이 VB6 WinSock 컨트롤에 붙어있는 것처럼 보입니다. (들으니 나쁘지 않습니까?).

피할 수있는 지뢰 나 장애물을 처리 할 수 ​​있도록주의 사항이나 조언이 있습니까? clientStream은 TcpListener에서 지어진하여 TcpClient와 관련된는 NetworkStream입니다

private bool SendToStream(NetworkStream clientStream, string message) 
     { 
     try 
     { 
      message = Crypto.Encrypt(message); 
      message = message + "\r\n"; 
      byte[] buffer = System.Text.Encoding.ASCII.GetBytes(message.ToCharArray()); 
      if (clientStream != null) 
      { 
       StreamWriter blah = new StreamWriter("lastsent_a.txt"); 
       blah.WriteLine("[some clientStream]" + Environment.NewLine + Environment.NewLine + message + Environment.NewLine + Environment.NewLine + Crypto.Decrypt(message)); 
       blah.Close(); 

       clientStream.Write(buffer, 0, buffer.Length); 
       clientStream.Flush(); 
       return true; 
      } 
      return false; 
     } 
     catch (Exception e) 
     { 
      ProcessDebugLog("ERROR - SendToStream: " + e.Message.ToString()); 
      return false; 
     } 
     } 

:

현재 구현은 다음과 같은 방법으로 메시지를 보내는 서버 (C# .NET을)를 갖는다.

클라이언트는 다음과 같은 방법 (VB6의 윈속 스타일)에서 메시지를 수신 :

Private Sub wskConnect_DataArrival(ByVal bytesTotal As Long) 
    Dim sBuff As String 
    wskConnect.GetData sBuff, vbString  '-- Retrieve sent value 
    ProcessMessage sBuff      '-- Process the value 
End Sub 

편집 : 나는 C#에서의 TCP 클라이언트를 디버깅 할 때 나는 TcpListener의는 NetworkStream을 사용하여 동 기적으로 .Receive을한다. 분명히 이것은 프로세서를 소모하지만 분명히 비동기식 소켓 이벤트가 발생한다는 것을 신뢰하는 대신 모든 단일 바이트가 줄을 잡도록 내버려 둔다. VB6 코드를 동기식으로 전환하고 이벤트 발생시 시각 장애인 신뢰를 제거하여 시작할 수 있습니까?

+3

나는 항상 vb6에서 winsock을하는 것을 좋아했다. 내가 생각할 수있는 유일한 것은 데이터 구조입니다. 일반적인 이진 형식 또는 XML을 사용하고 있는지 확인하는 것이 좋습니다. –

+0

문제/질문은 정확히 무엇입니까? MS Winsock 대신 Catalyst에서 TCP/IP COM 개체를보고 싶을 수 있습니다. 더 많은 기능을 제공합니다. (귀하의 필요에 따라). 또한 FYI, 네트워크 스트림에서 Flush를 호출해도 아무 것도 할 수 없습니다. – tcarvin

+0

문제는 VB6 Tcp 클라이언트가 들어오는 메시지의 절반을 놓치는 것입니다. 내. NET 클라이언트 중 누구도 그렇게하지 않습니다. –

답변

4

TCP는 TCP이며, 특히 .NET TcpClient 클래스조차도 VB6 WinSock과 동일한 소켓 인프라에 구축됩니다. 의사 소통은 간단해야하지만 DustinDavis가 언급 한 것처럼 VB6 (데이터 구조 및 바이너리 형식 지정과 같은)을 사용하는 것이 쉽지 않습니다.

EDIT : 업데이트가 있으면 VB6 클라이언트의 소켓에서 bytesTotal 만 읽어야합니다. 그렇지 않으면 다음 패킷 (또는 현재 패킷의 일부만)의 일부를 가져올 수 있기 때문입니다. DataArrival 이벤트는 새 데이터를 읽을 수있을 때만 트리거되기 때문에 문제입니다. 이것은 높은 교통량 시스템에서 특히 두드러집니다. 어렸을 우리가 항상 IP*Works!

사용하는 데 사용 VB3과 VB6 개발을해야 할 일을했을 때

+0

내가 요청한 이유는 현재 실행중인 서버 버전과 VB6이 비동기 읽기를 수행하기 위해 WinSock을 사용하고 있기 때문입니다. 단, 이벤트가 표면적으로 <75 %의 발사에는 실패하지 않았습니다. 새로운 .NET Tcp 클라이언트가 연결되면 전혀 문제가 없습니다. –

+1

아마 그것이 당신의 질문이 실제로 물어야하는 것입니까? 일부 소스 코드를 보지 않고는 원인을 파악하기 어려울 것입니다. –

+0

@ Nunya : 그렇다면 VB6 코드가 .NET이 아닌 서버에서 동등하게 실패 할 것으로 예상됩니다. 다른 쪽 끝은 Winsock이하는 일에 아무런 영향을 미치지 않아야합니다. 단지 데이터 스트림 일뿐입니다. – Deanna

0

는 라이센스 수수료는 네트워킹과 좋은 재생 고전 VB를 받고 번거 로움에서 엄청난 감소 잘 가치가 있었다.

공개 사항 : 저는 제조 업체를 위해 일하거나 관련이 없습니다. 나는이 제품의 만족스러운 이전 사용자 일뿐입니다.