2011-02-04 4 views
3

실제로 메시지를 보내려면 연결을 닫아야합니까? send 명령을 사용하든 네트워크 스트림을 사용하든, 연결을 끊을 때까지 메시지가 처리되지 않기 때문입니다. 그게 그것이 있어야 할 방식인가요, 아니면 제가 빠진 것이 아닌가요?TcpClient 보내기/닫기 문제

여기 코드가 있습니다.

private void connectButton_Click(object sender, EventArgs e) 
{ 
    try 
    { 
     client = new TcpClient(); 
     client.Connect(ip, port); 
     netStream = client.GetStream(); 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.Message); 
    } 
} 

private void disconnectButton_Click(object sender, EventArgs e) 
{ 
    if (client != null) 
    { 
     if (client.Connected) 
     { 
     client.Close(); 
     client = null; 
     } 
    } 
} 

private void sendButton_Click(object sender, EventArgs e) 
{ 
    byte[] cmd = ToByteArray("bla bla bla"); 
    netStream.Write(cmd, 0, cmd.Length); 
    netStream.Flush(); 
} 

나는이 방법과 관련이 없지만 모양을 가지고 있습니다. 당신은 아마 버퍼 스트림을 사용하는

public static byte[] ToByteArray(string str) 
{ 
    System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding(); 
    return encoding.GetBytes(str); 
} 
+0

어떤 수업을 사용하고 있습니까? + 코드 예제를 붙여 넣습니다. –

+1

모든 코드는 우리 소유입니다. – jgauffin

+0

ToByteArray는 어떤 모습입니까? – SwDevMan81

답변

1

는 Clode (으)가 호출 될 때 자동으로 호출되는 .Flush 메소드를 호출하려고합니다.

+0

나는 그것을 이미 시도했다. 그것은 작동하지 않습니다 : ( – joshua

+0

흠 당신이 말한 것처럼 여기에 NetworkStream 문제가있는 것처럼 보입니다. 플러시가 작동하지 않지만 닫히기/처분합니다. 지금 이유를 알아야합니다. – joshua

0

아니오; 그들은 아마도 200ms의 지연 후에 발송 될 것입니다.

틀린 뭔가가 있어야합니다.

+0

NoDelay 옵션을 사용했습니다. 차이점은 – joshua

+1

'NoDelay'는 거의 사용되지 않아야한다. 그러므로 내가 틀린 뭔가가 틀림 없다는 결론을 내렸다. –

0

Write 이후 메인 스레드가 실행되지 않도록 차단하면 메시지 펌프가 실행되어 데이터를 보내지 못하게 될 수 있습니다. 따라서 주 스레드를 해제하면 (데이터 스트림을 닫음) 문제가 해결되는 것처럼 보일 수 있지만 실제로는 데이터를 처리하고 쓰는 주 스레드가 해제됩니다. 그것은 행동 Nagle's algorithm 것 같다

void clientThread() 
{ 
    writeStream.BeginWrite(buffer, 0, buffer.Length, myCallback, networkStream); 
    resetEvent.WaitOne(timeout); 
} 
void myCallback(IAsyncResult ar) 
{ 
    NetworkStream myNetworkStream = (NetworkStream)ar.AsyncState; 
    myNetworkStream.EndWrite(ar); 
    resetEvent.Set(); 
} 
+0

남자 답다. 고마워. – joshua

+0

@joshua - 우리가 어떤 코드를 게시하면 문제 없다. 더 많은 것을 도울 수 있습니다. – SwDevMan81

0

:

당신이 이런 식으로 BeginWrite를 사용 확인, 데이터가 기록 될 때까지 차단하고자하는 경우

. SetSocketOption 방법을 사용하여 NoDelay 소켓 옵션을 사용하도록 설정합니다. 하지만 Nagle의 알고리즘을 사용 중지하면 처리량이 다운 그레이드됩니다.

관련 문제