0

C# で記述された TCP クライアントがあり、backgroundWorker を使用してサーバーに接続します。次のようになります。

void ConnectToServer() {
    try {
        bwConnector = new BackgroundWorker();
        bwConnector.DoWork += new DoWorkEventHandler(bwConnector_DoWork);
        bwConnector.RunWorkerCompleted = new RunWorkerCompletedEventHandler(bwConnector_RunWorkerCompleted);
        bwConnector.RunWorkerAsync();
        e.Result = true;
    } catch {
        e.Result = false;
    }
}

void bwConnector_DoWork(object sender, DoWorkEventArgs e) {

    clientSocket = new Socket(xxxxxx);
    clientSocket.Connect(xxxx);

    this.networkStream = new NetworkStream(this.clientSocket);
    this.bwReceiver = new BackgroundWorker();
    this.bwReceiver.DoWork += new DoWorkEventHandler(StartReceive);
    ........
}

clientSocket.Connectedまた、true または falseをチェックするタイマーがあります。false の場合はConnectToServer()、別の接続試行のために再度呼び出します。

問題は、アプリケーションを閉じて再度開くたびに、最後のソケットがまだそこに残っており、同じ IP で異なるポートがサーバーに接続されている 2 つのソケットがあるようです。

私でさえ、次のようなものがあります:

void bwConnector_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {

    ((BackgroundWorker)sender).Dipose();
    if (!((bool)e.Result)) {
        Debug.Log("failed");
    } else {
        Debug.Log("success");
    }
}

切断のために、私はそのようなコードを持っています:

System.Net.NetworkInformation.NetworkChange.NetworkAvailablilityChanged += new System.Net.NetworkInformation.NetworkAvailabilityChangedEventHandler(NetworkAvailabilityChanged);
private void NetworkChange_NetworkAvailabilityChanged(object sender , System.Net.NetworkInformation.NetworkAvailabilityEventArgs e)
    {
        if ( !e.IsAvailable )
        {
            this.OnNetworkDead(new EventArgs());
            this.OnDisconnectedFromServer(new EventArgs());
        }
        else
            this.OnNetworkAlived(new EventArgs());
    }
...............
public event DisconnectedEventHandler DisconnectedFromServer;
protected virtual void OnDisconnectedFromServer(EventArgs e)
{
    if ( DisconnectedFromServer != null )
    {
        DisconnectedFromServer(this , e);
    }
}
...........
void StartReceive(xxxxxxxxx) {
    while (this.clientSocket.Connected) {
        .........
    }
    this.Disconnect();
}

bool Disconnect() {
    if (this.clientSocket != null && this.clientSocket.Connected) {
        try {
            this.clientSocket.Shutdown(SocketShutdown.Both);
            this.clientSocket.Close();
            return true;
        } catch {
            return false;
        }
    }
}

手伝ってくれてありがとう。

4

1 に答える 1

1

SOの提案に従って、ここで応答します。

悲しいことに、実際のアプリケーションは失敗する傾向があり、しばしば予期しないことが起こります。ユーザーが誤って閉じてしまうことは、最も明白な「予期しないこと」かもしれません。他に何もないとしても、少なくともすべてが終了時にクリーンアップされるようにしました。

結局、すべてはあなた次第です。

于 2013-04-26T07:57:06.027 に答える