버그 해결을 위한 모든 질문을 던져
0 votes
491 views

현재 유니티 C#을 이용해 UDP통신을 하려고 하고 있습니다.

아래는 udp서버로 패킷을 보내는 코드 입니다.

    public string ip; //ip문자열
    public int port; //포트 번호
    IPEndPoint IPEP,SENDIPEP;
    UdpClient Client_Send; //소켓
    public InputField Send_TXT; //보낼 메세지를 쓰는 inputfield
    public InputField IP_INPUT, PORT_INPUT; //보낼 ip주소와port를 쓰는 inputfield

    void Setting(string IP_Set, int Port_Set) //전송할 ip와 포트를 설정해주는 함수
    {
        ip = IP_Set; //ip입력
        port = Port_Set; //port입력
        SENDIPEP = new IPEndPoint(IPAddress.Parse(Client_IP), port); //자신의 아이피와 포트 지정
        Client_Send = new UdpClient(SENDIPEP); //이 부분에서 오류남
        IPEP = new IPEndPoint(IPAddress.Parse(ip), port); //보낼 주소 설정
    }

    public void Send_Data(string str) //버튼을 누르면 전송하는 함수. str을 전송함
    {
        Setting(IP_INPUT.text, int.Parse(PORT_INPUT.text)); //ip,port 입력
        try
        {
            byte[] data = Encoding.UTF8.GetBytes(Send_TXT.text); //str을 byte로 변환함
            Client_Send.Send(data, data.Length, IPEP); //전송
        }
        catch (Exception err)
        {
            print(err.ToString());
        }
    }

    public static string Client_IP //자신의 아이피 구하는 함수
    {
        get
        {
            IPHostEntry host = Dns.GetHostEntry(Dns.GetHostName());
            string ClientIP = string.Empty;
            for (int i = 0; i < host.AddressList.Length; i++)
            {
                if (host.AddressList[i].AddressFamily == AddressFamily.InterNetwork)
                {
                    ClientIP = host.AddressList[i].ToString();
                }
            }
            return ClientIP;
        }
    }

이런식으로 코드를 작성하였는데 Client_Send = new UdpClient(SENDIPEP); 부분에서

SocketException: 각 소켓 주소(프로토콜/네트워크 주소/포트)는 하나만 사용할 수 있습니다.
라는 오류가 뜹니다.

혹시 해결방법을 알고 계시는분 있나요???

asked (10 point) , 491 views

2 answers

+1 vote
우수 답변
send_data("...") 할때마다 setting(,)을 계속 호출하나요?

왜 보낼때마다 udpclient를 생성하죠?

c# 네트워크 프로그래밍을 정확하게 알고 하시는건 아닌거 같은데...
answered (130 point)
선택됨
오류난 부분을 Start()함수로 보내어 문제를 해결하였습니다. 저도 쉬운 부분에서 틀려서 어이가 없었네요..아무튼 답변이 많은 도움이 되었습니다. 감사합니다!!
+1 vote
해당 오류는 사용중인 포트에 바인딩을 하려고 할 때 발생합니다.

코드에서 문제 원인으로 생각되는 부분은,
버튼을 누를 때마다 UdpClient를 생성하는데, 생성 시 매개변수로 IPEndPoint를 지정하셨기 때문에 해당 주소로 바인딩이 일어납니다. 즉 버튼을 누를 때마다 바인딩이 발생하는 거지요.

 

일단 최선의 방법은,
프로그램이 시작할 때나 통신 시작 버튼을 따로 만들어서 UdpClient를 한번만 생성시켜서 사용하는 것입니다. 즉, Setting 함수를 Send_Data에서 빼시면 될 것 같네요.

그리고 UDP 통신은 그 특성 상 바인딩이 필요 없습니다.
위 조치 만으로도 충분하지만, 바인딩이 굳이 필요한 것이 아니라면 SENDIPEP 변수도 삭제하시는 걸 권장드립니다.

 

이렇게 조치해도 안 될 수도 있는데, netstat 등의 명령어로 포트가 사용 중인지 여부도 확인해 보세요.
사용 중이라면 해당 포트를 사용하는 프로그램을 종료하거나 다른 포트를 사용해 보시면 되겠습니다.
answered (143 point)

버그 해결을 위해 도움을 구하고, 도움을 주세요. 우리는 그렇게 발전합니다.

throw bug 는 프로그래밍에 대한 전분야를 다룹니다. 질문,논의거리,팁,정보공유 모든 것이 가능합니다. 프로그래밍과 관련이 없는 내용은 환영받지 못합니다.

239 질문
367 answers
376 댓글
470 users