나는 서버에 메시지를 보내고 응답을 다시받는 UDP 클라이언트 채팅을 가지고있다. 두 개의 스레드가 있습니다. 하나는 전송 용이고 다른 하나는 메시지를 수신하기위한 것입니다. ReceiveFrom() 메서드를 사용하여 예외가 발생합니다. "이 작업을 수행하기 전에 Bind 메서드를 호출해야합니다." 그러나 이것은 클라이언트입니다, 나는 아무것도 바인딩하고 싶지 않습니다. 예를 들어,이 클라이언트는 정상적으로 작동합니다.udp 클라이언트 바인드
byte[] data = new byte[30];
string input, stringData;
IPEndPoint servIPEP = new IPEndPoint(
IPAddress.Parse("127.0.0.1"), 9050);
EndPoint servEP = (EndPoint)servIPEP;
Socket client = new Socket(AddressFamily.InterNetwork,
SocketType.Dgram, ProtocolType.Udp);
string welcome = "Hello, are you there?";
data = Encoding.ASCII.GetBytes(welcome);
client.SendTo(data, data.Length, SocketFlags.None, servEP);
data = new byte[30];
int recv = client.ReceiveFrom(data, ref servEP); //works fine!
받는 바인딩이 없습니다. 하지만 두 개의 스레드를 만들면 오류가 발생합니다.
public ChatClient()
{
clientSock = new Socket(AddressFamily.InterNetwork,
SocketType.Dgram, ProtocolType.Udp);
servIPEP = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 32000);
servEP = (EndPoint)servIPEP;
}
public void ReceiveThread()
{
Thread receiveThread = new Thread(new ThreadStart(ReceiveData));
receiveThread.Start();
}
public void ReceiveData()
{
while(true){
clientSock.ReceiveFrom(buf, ref servEP); //Here I get ERROR
string msg = Encoding.ASCII.GetString(buf).Trim();
Console.WriteLine("New message: {0}",msg);
}
}
public void SendThread()
{
Thread sendThread = new Thread(new ThreadStart(SendData));
sendThread.Start();
}
public void SendData()
{
while (true)
{
Console.WriteLine("Enter message to send: ");
string msg = Console.ReadLine();
buf = Encoding.UTF8.GetBytes(msg);
clientSock.SendTo(buf, servEP);
}
}
}
static void Main(string[] args)
{
ChatClient client = new ChatClient();
client.SendThread();
client.ReceiveThread();
}
}
감사합니다.
SendTo()가 처음 인 경우에만 작동하며, 그렇지 않으면 ReceiveFrom()이 처음 작동하지 않을 때 작동한다는 것을 알게되었습니다. 누군가가 왜 이렇게 작동하는지 설명 할 수 있습니까? –