【问题标题】:Change Protocol from UDP to TCP in a simple chat application在一个简单的聊天应用程序中将协议从 UDP 更改为 TCP
【发布时间】:2013-12-03 00:41:28
【问题描述】:

我想将我用于简单聊天应用程序的协议从使用 UDP 更改为使用 TCP 协议。

我声明了这些对象:

Socket sck;
EndPoint epLocal, epRemote;

并在构造函数中初始化它们:

sck = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
sck.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);

我在启动连接的按钮中有这个:

private void btn_Start_Click(object sender, EventArgs e) {
    epLocal = new IPEndPoint(IPAddress.Parse(textLocalIp.Text),Convert.ToInt32(textLocalPort.Text));
    sck.Bind(epLocal);

    epRemote = new IPEndPoint(IPAddress.Parse(textFriendsIp.Text), Convert.ToInt32(textFriendsPort.Text));
    sck.Connect(epRemote);

    byte[] buffer = new byte[1500];
    sck.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref epRemote, new AsyncCallback(MessageCallBack), buffer);
}

并在发送消息按钮中单击:

private void btn_Send_Click(object sender, EventArgs e){
    System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();
    byte[] msg = new byte[1500];
    msg = enc.GetBytes(textMessage.Text);
    sck.Send(msg);
}

这里是“回调”方法:

private void MessageCallBack(IAsyncResult aResult){
    int size = sck.EndReceiveFrom(aResult, ref epRemote);
    if (size > 0){
        byte[] recievedData = new byte[1464];
        recievedData = (byte[])aResult.AsyncState;
        ASCIIEncoding eEncoding = new ASCIIEncoding();
        string recievedMessage = eEncoding.GetString(recievedData);
        listMessage.Items.Add("Friend: "+recievedMessage);
    }
    byte [] buffer = new byte[1500];
    sck.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref epRemote, new AsyncCallback(MessageCallBack), buffer);
}

那么我应该改变什么来让它从使用 UDP 协议到使用 TCP 协议。 谢谢!

【问题讨论】:

  • 任何理由你不能只使用ProtocolType.TcpSocketType.Streammsdn.microsoft.com/en-us/library/…
  • 是的,我试过了,但没有用,说:试图以访问权限禁止的方式访问套接字
  • 你使用什么端口?
  • Client1 "80" 和 Client2 "81"
  • 使用一组不同的端口。 ( netstat -at ) 运行该命令以帮助确定打开的内容。

标签: c# sockets tcp udp


【解决方案1】:

你有什么理由不能只使用 ProtocolType.Tcp

sck = new Socket(AddressFamily.InterNetwork,  
    SocketType.Stream, 
    ProtocolType.Tcp);

和博客来帮助你

http://netrsc.blogspot.com/2010/05/using-asynchronous-sockets.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-11
    • 2020-08-30
    • 1970-01-01
    • 2016-05-06
    • 2015-06-14
    • 2022-12-22
    • 1970-01-01
    相关资源
    最近更新 更多