在发送数据之前检查插座是否已连接

时间:2009-10-22 00:45:08

标签: c# sockets

我正在使用超简单的同步C#套接字进行分配。分配是创建点对点聊天程序,因此每个实例必须同时作为客户端和服务器。当我把它放入监听模式时,我的程序运行得很好:( StateBall是一个传递状态变量的对象)

public void startListening()
{
    lState = new StateBall();
    IPEndPoint peer = new IPEndPoint(StateBall.host, StateBall.port);
    lSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream,    
    ProtocolType.Tcp);

    try
    {
        lSocket.Bind(peer);
        lSocket.Listen(10);
        Console.WriteLine("Waiting for a connection...");

        StateBall.updateText("Waiting for a Connection...");

        client = lSocket.Accept();
        StateBall.toSend=StateBall.ourName;

        StateBall.updateText("Connection made! Sending our name...");
...

但是当我尝试启动第二个实例并连接到已经运行的实例时,它只是挂起并且没有连接。

从我在本网站和其他网站上看到的内容,我可以使用以下内容检查预先存在的连接:

try{
    lsocket.Connect(peer);
}
catch(Exception ex){
    //check for SocketException type and errors
}

然后继续我的程序,但有没有一种干净的方法将初始检查集成到现有的代码中?或者,在尝试在我的套接字对象上调用Connect之前,是否有更好的方法来检查活动主机?

1 个答案:

答案 0 :(得分:1)

您可以并且可能应该处理多个并发连接。只需在循环中调用accept并在不同的线程上调度客户端。我想你只使用一个线程,所以当服务器忙于一个客户端连接时,尝试在客户端超时。