2016-01-20 152 views
0

我在寫一些雙向套接字代碼時遇到了一些麻煩。我連接到服務器這樣的:c#從BeginConnect獲取遠程套接字

_clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
_clientSocket.BeginConnect(new IPEndPoint(IPAddress.Parse("100.100.100.1"), 8677), new AsyncCallback(ConnectCallback), null); 
_buffer = new byte[_clientSocket.ReceiveBufferSize]; 

然後在回調我這樣做:

private void ConnectCallback(IAsyncResult AR) 
{ 
    _clientSocket.EndConnect(AR); 

    byte[] buffer = Encoding.ASCII.GetBytes("CONNECT"); 
    _clientSocket.BeginSend(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(SendCallback), null); 
} 

我還需要從服務器接收數據,但我對如何尚不清楚在此過程中獲取服務器的套接字。我編寫了一些BeginReceive邏輯,但我一直在使用錯誤的套接字獲取錯誤。

好像在我上面的代碼中的某個地方我應該能夠得到類似我如何做它在我的服務器的BeginAccept回調代碼插座:

_serverSocket.BeginAccept(new AsyncCallback(AcceptCallback), _serverSocket); 

然後在AcceptCallback:

Socket server = (Socket)AR.AsyncState; 
Socket client = server.EndAccept(AR); 

對我來說,我似乎很明顯,我只是錯過了一個步驟或概念讓我過去。我做了無數次的搜索,但無論是尋找錯誤的東西,還是隻是不在那裏。

回答

1

不,您實際上不需要服務器端套接字。你應該使用你的客戶端套接字。 連接完成後,您可以撥打_clientSocket.BeginReceive()。例如,在ConnectCallback方法中,與您使用BeginSend一樣。 如果您因此而發生異常,請添加您正在使用的確切代碼以及您正在獲得的例外情況。

+0

我將添加代碼和錯誤 – ESDictor

+0

你是100%正確的。我看到的錯誤實際上來自服務器,而不是客戶端(帶有使客戶端看起來像客戶端的複製/粘貼錯誤)..我將把它標記爲答案,因爲你所說的是100%正確的。 – ESDictor