c# - 套接字通信C#

标签 c# sockets

我正在使用此类从/向我的应用程序发送 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, 0, 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], 0, 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('\0');
                }
                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);

它总是通过在 socket.SendToAsync(socketEventArg); 未处理的参数异常 “参数 remoteEP 不能是 DnsEndPoint 类型。” "参数名称:remoteEP"

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

-更新-

我尝试将代码更改为:

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

关于c# - 套接字通信C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8141291/

相关文章:

c# - 从 C# .ashx 运行 cscript.exe 不执行 vbscript 文件中的代码

java - Java/Python 中的快速 IPC/Socket 通信

java - udp 服务器上的 java 地址已在使用错误

c# - ASP MVC.NET - 如何绑定(bind) KeyValuePair?

c# - Raycast 没有击中我点击的内容

c# - Linq:获取值存在于另一个表中的行

node.js - 使用redis与socket.io和NodeJs构建实时聊天

c# - "An operation on a socket could not be performed because the system lacked sufficient buffer space or because a queue was full"

java - 如何使用套接字从 Python 向 Java 发送字节?

c# - 处理将操作参数绑定(bind)到不正确类型的路由值的错误