错误“通常只允许使用每个套接字地址(协议/网络地址/端口)”
问题描述:
我正在使用套接字/ tcplistener在发件人和接收方windows application
上工作。错误“通常只允许使用每个套接字地址(协议/网络地址/端口)”
我正在此错误
每个套接字地址中的一个使用量(协议/网络地址/端口) 通常允许
误差在catch块来StartReciever
方法
以下是我的代码。
// On button click
private void btnLoadFile_SendFile_Click(object sender, EventArgs e)
{
StartReciever();
SendData(tcpIpAddress, port, filename);
}
private void StartReciever()
{
util.LoadSettings();
string tcpIpAddress = util.svrSettings["IpAddress"];
string port = util.svrSettings["Port"];
string outDir = util.svrSettings["isOutput"];
new Thread(
() =>
{
if (!File.Exists(util.settingFile))
Logger("Please setup the services first.");
else
{
try
{
IPAddress ipAddress = IPAddress.Parse(tcpIpAddress);
TcpListener tcpListener = new TcpListener(ipAddress, Convert.ToInt32(port));
tcpListener.Start();
Logger("\nWaiting for a client to connect...");
//blocks until a client connects
Socket socketForClient = tcpListener.AcceptSocket();
Logger("\nClient connected");
//Read data sent from client
NetworkStream networkStream = new NetworkStream(socketForClient);
int bytesReceived, totalReceived = 0;
string fileName = "testing.txt";
byte[] receivedData = new byte[10000];
do
{
bytesReceived = networkStream.Read
(receivedData, 0, receivedData.Length);
totalReceived += bytesReceived;
Logger("Progress of bytes recieved: " + totalReceived.ToString());
if (!File.Exists(fileName))
{
using (File.Create(fileName)) { };
}
using (var stream = new FileStream(fileName, FileMode.Append))
{
stream.Write(receivedData, 0, bytesReceived);
}
}
while (bytesReceived != 0);
Logger("Total bytes read: " + totalReceived.ToString());
socketForClient.Close();
Logger("Client disconnected...");
tcpListener.Stop();
}
catch (Exception ex)
{
// Error : "Only one usage of each socket address (protocol/network address/port) is normally permitted"
Logger("There is some error: " + ex.Message);
}
}
}).Start();
}
private static void SendData(string tcpIpAddress, string port, string filename)
{
new Thread(
() =>
{
TcpClient tcpClient = new TcpClient(tcpIpAddress, Convert.ToInt32(port));
//const int bufsize = 8192;
const int bufsize = 10000;
var buffer = new byte[bufsize];
NetworkStream networkStream = tcpClient.GetStream();
using (var readFile = File.OpenRead(filename))
{
int actuallyRead;
while ((actuallyRead = readFile.Read(buffer, 0, bufsize)) > 0)
{
networkStream.Write(buffer, 0, actuallyRead);
}
}
}).Start();
}
答
我的猜测是,接收器开始通过第一按钮单击仍在运行,所以当你试图建立第二个TcpListener
在同一个地址和端口,你得到的异常。
您应该添加一些代码,以防止您并行创建两个相同的侦听器。
+0
任何想法如何做你提出的相同,因为我正在寻找相同的? – Gaurav123
答
您可以在Click事件处理函数中调用StartReceiver
方法,这就是为什么它会尝试第二次打开相同的端口。它只需要调用一次,将它移动到其他地方,比如在你的程序初始化代码中。
请注意,当我第二次点击按钮时发生错误。第一次点击不会引发任何错误 – Gaurav123
每次单击按钮时,您都在初始化侦听器,因此第二次尝试会抛出此异常。您只应初始化并启动侦听器一次。 –