【发布时间】: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.Tcp和SocketType.Streammsdn.microsoft.com/en-us/library/… -
是的,我试过了,但没有用,说:试图以访问权限禁止的方式访问套接字
-
你使用什么端口?
-
Client1 "80" 和 Client2 "81"
-
使用一组不同的端口。 ( netstat -at ) 运行该命令以帮助确定打开的内容。