加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

套接字通信C#

发布时间:2020-12-15 21:25:55 所属栏目:百科 来源:网络整理
导读:我正在使用这个类从我的应用程序发送Echo测试 public class SocketClient{ Socket socket = null; static ManualResetEvent clientDone = new ManualResetEvent(false); const int TIMEOUT_MILLISECONDS = 5000; const int MAX_BUFFER_SIZE = 2048; public S
我正在使用这个类从我的应用程序发送Echo测试

public class SocketClient
{
    Socket socket = null;
    static ManualResetEvent clientDone = new ManualResetEvent(false);
    const int TIMEOUT_MILLISECONDS = 5000;
    const int MAX_BUFFER_SIZE = 2048;

    public SocketClient()
    {
        socket = new Socket(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp);
    }

    public string Send(string serverName,int portNumber,string data)
    {
        string response = "Timeout";

        if (socket != null)
        {
            SocketAsyncEventArgs socketEventArg = new SocketAsyncEventArgs();
            socketEventArg.RemoteEndPoint = new DnsEndPoint(serverName,portNumber);

            socketEventArg.Completed += new EventHandler<SocketAsyncEventArgs>(delegate(object s,SocketAsyncEventArgs e)
            {
                response = e.SocketError.ToString();
                clientDone.Set();
            });

            byte[] payload = Encoding.UTF8.GetBytes(data);
            socketEventArg.SetBuffer(payload,payload.Length);
            clientDone.Reset();
            socket.SendToAsync(socketEventArg);

            clientDone.WaitOne(TIMEOUT_MILLISECONDS);
        }
        else
        {
            response = "not initialized";
        }
        return response;
    }

    public string Recieve(int portNumber)
    {
        string response = "Timeout";

        if (socket != null)
        {
            SocketAsyncEventArgs socketEventArg = new SocketAsyncEventArgs();
            socketEventArg.SetBuffer(new Byte[MAX_BUFFER_SIZE],MAX_BUFFER_SIZE);

            socketEventArg.Completed += new EventHandler<SocketAsyncEventArgs>(delegate(object s,SocketAsyncEventArgs e)
            {
                if (e.SocketError == SocketError.Success)
                {
                    response = Encoding.UTF8.GetString(e.Buffer,e.Offset,e.BytesTransferred);
                    response.Trim('');
                }
                else
                {
                    response = e.SocketError.ToString();
                }

                clientDone.Set();
            });

            socketEventArg.RemoteEndPoint = new IPEndPoint(IPAddress.Any,portNumber);

            clientDone.Reset();

            socket.ReceiveFromAsync(socketEventArg);
            clientDone.WaitOne(TIMEOUT_MILLISECONDS);
        }

        return response;
    }

    public void Close()
    {
        socket.Close();
    }
}

这是我如何使用它:

SocketClient client = new SocketClient();
        client.Send("192.168.1.2",77,"besm ellah");
        textBox1.Text=client.Recieve(77);

它总是通过Argument Exception在socket.SendToAsync(socketEventArg)中未处理;
“参数remoteEP不能是DnsEndPoint类型.”
“参数名称:remoteEP”

我在Windows功能上启用了简单TCP / IP的功能,但它也不起作用.

-UPDATE-

我尝试将代码更改为:

IPAddress[] localIPs = Dns.GetHostAddresses(Dns.GetHostName());
socketEventArg.RemoteEndPoint = new IPEndPoint(localIPs[3],portNumber);

它没有给出异常,但是消息没有通过.

解决方法

好吧,看起来您应该将其更改为不同类型的端点,而不是DNS端点.

我认为你应该使用IPEndPoint

http://msdn.microsoft.com/en-us/library/system.net.sockets.socketasynceventargs.aspx

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读