레거시 제품의 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 코드를 동기식으로 전환하고 이벤트 발생시 시각 장애인 신뢰를 제거하여 시작할 수 있습니까?
나는 항상 vb6에서 winsock을하는 것을 좋아했다. 내가 생각할 수있는 유일한 것은 데이터 구조입니다. 일반적인 이진 형식 또는 XML을 사용하고 있는지 확인하는 것이 좋습니다. –
문제/질문은 정확히 무엇입니까? MS Winsock 대신 Catalyst에서 TCP/IP COM 개체를보고 싶을 수 있습니다. 더 많은 기능을 제공합니다. (귀하의 필요에 따라). 또한 FYI, 네트워크 스트림에서 Flush를 호출해도 아무 것도 할 수 없습니다. – tcarvin
문제는 VB6 Tcp 클라이언트가 들어오는 메시지의 절반을 놓치는 것입니다. 내. NET 클라이언트 중 누구도 그렇게하지 않습니다. –