2010-03-22 11 views
1

VS.NET에 두 개의 소켓 프로젝트가 있습니다. 그들 중 하나는 발신자이고, 다른 하나는 수신자입니다. 수신기를 시작한 후, 나는 보낸 사람으로부터 데이터를 보낸다. send 메소드는 성공적으로 전송 된 것처럼 13 바이트를 반환하지만 수신기는 0을받습니다. 수신자는 발신자 소켓을 수락하고 수신합니다. 그러나 데이터를받을 수 없습니다. 왜?소켓 통신 관련 문제

P. : 발신자 코드가 수신자 프로젝트에 입력되면 수신자도 데이터를 가져올 수 있습니다.

+0

더 많은 코드가 필요합니다. 어떻게 연결을 설정하고 데이터를 보내고 있습니까? – NibblyPig

답변

1

} 은} 나는 문제가 수신기가 데이터를 읽을 수 있습니다 전에 전송 응용 프로그램을 종료하는 것을 생각합니다. Send 호출 후 Thread.Sleep(1000);을 입력하면 수신 응용 프로그램에서 데이터를 읽습니다 (적어도 테스트했을 때).

0

대부분이 코드의 버그이지만 코드를 보지 않아도 말할 수 없습니다.

그러나 TCP/IP에는 메시지 개념이없고 데이터 스트림 만 있습니다. 따라서 13 바이트를 보내고 하나의 읽기에서 6을 받고 다음에서 7을 수신 할 수 있습니다. 또는 반대로 13 바이트를 보낸 다음 나중에 7 바이트를 더 보내면 수신 측에서 20 바이트의 단일 블록으로 수신합니다.

0

관심을 가져 주셔서 대단히 감사합니다. 다음은 코드입니다.

/******************** 수신자 *** *******************/

클래스 프로그램 { 정적 무효 메인 (문자열 []에 args) { 수신기 RECV = 새로운 수신기(); recv.Start();
} }

public class Receiver 
{ 
    public void Start() 
    { 
     Socket gateSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
     gateSocket.Bind(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8999)); 
     gateSocket.Listen(12); 

     Thread thGateListen = new Thread(new ParameterizedThreadStart(GateListener)); 
     thGateListen.Start(gateSocket); 
    } 

    public void GateListener(object obj) 
    { 

     Socket gateSocket = (Socket)obj; 

     for (; ;) 
     { 
      Socket newRequest = gateSocket.Accept(); 
      Console.WriteLine("New Connection Request"); 
      Thread thReadData = new Thread(new ParameterizedThreadStart(ReadFromSocket)); 
      thReadData.Start(newRequest); 
     } 
    } 


    public void ReadFromSocket(object obj) 
    { 
     Socket s = (Socket)obj; 
     for (; ;) 
     { 
      if (s.Available > 0) 
      { 
       byte[] buffer = new byte[s.Available]; 
       s.Receive(buffer); 
       Console.WriteLine(System.Text.Encoding.ASCII.GetString(buffer)); 
      } 
     } 
    } 

} 

/*********************************** 보낸 사람 * *********************/

클래스 프로그램 { 정적 무효 메인 (문자열 []에 args) { 발신자 S는 새로운 발신자() ; s.Send ("Hello Socket!");

class Sender 
{ 
    public void Send(string s) 
    { 
     Socket sendSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
     sendSocket.Connect(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8999)); 

     sendSocket.Send(System.Text.Encoding.ASCII.GetBytes(s)); 
    } 

} 
+0

기계에서 포트를 하나만 열 수 있습니까? – kenny

+0

수신자 프로그램이 데이터를 받기 전에 발신자 프로그램이 종료되었다고 생각합니다. 보낸 사람 프로그램에서 send() 후에 잠을 자고 작동하는지 확인하십시오. – kumar