2013-07-09 35 views
0

C#應用程序有一個後臺工作線程,它啓動一個buttonclick。c#監聽器和winsock發送者DLL之間的套接字通信

 private void button1_Click(object sender, EventArgs e) 
     { 
      if (bw.IsBusy != true) 
      { 
       bw.RunWorkerAsync(); 
      } 
     } 

     private void bw_DoWork(object sender, DoWorkEventArgs e) 
     { 
      IPAddress localAddr = IPAddress.Parse("127.0.0.1"); 

      TcpListener serverSocket = new TcpListener(localAddr,7898); 
      int requestCount = 0; 
      TcpClient clientSocket = default(TcpClient); 
      serverSocket.Start(); 

      clientSocket = serverSocket.AcceptTcpClient(); 
      requestCount = 0; 

      while ((true)) 
      { 
       try 
       { 
        requestCount = requestCount + 1; 
        NetworkStream networkStream = clientSocket.GetStream(); 
        byte[] bytesFrom = new byte[10025]; 
        networkStream.Read(bytesFrom, 0, (int)clientSocket.ReceiveBufferSize); 
        string dataFromClient = System.Text.Encoding.ASCII.GetString(bytesFrom); 
        dataFromClient = dataFromClient.Substring(0, dataFromClient.IndexOf("$")); 
        //Console.WriteLine(" >> Data from client - " + dataFromClient); 
        string serverResponse = "Server response " + Convert.ToString(requestCount); 
        Byte[] sendBytes = Encoding.ASCII.GetBytes(serverResponse); 
        networkStream.Write(sendBytes, 0, sendBytes.Length); 
        networkStream.Flush(); 
        //Console.WriteLine(" >> " + serverResponse); 
       } 
       catch (Exception ex) 
       { 
        //Console.WriteLine(ex.ToString()); 
       } 
      } 

      clientSocket.Close(); 
      serverSocket.Stop(); 
      Console.WriteLine(" >> exit"); 
      Console.ReadLine(); 

我也有在C++ DLL,C#語言參考,下面的代碼

 WSADATA WsaDat; 
    if (WSAStartup(MAKEWORD(2,2), &WsaDat) != 0){ 
    cout<<"WSA FAILED\n"; 
    cin.get(); 
    return 0; 
    } 

    SOCKET Socket; 
    Socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 
    if (Socket == SOCKET_ERROR){ 
    cout<<"Socket Failed to load\n"; 
    cin.get(); 
    return 0; 
    } 

    SOCKADDR_IN server; 

    server.sin_port=htons (7898); 
    server.sin_family = AF_INET; 

    server.sin_addr.s_addr = INADDR_ANY; 

    if (bind(Socket, (SOCKADDR *)(&server), sizeof (server)) == SOCKET_ERROR) 
    { 
    cout<<"BINDING FAILED\n"; 
    cin.get(); 
    return 0; 
    } 


    char buffer[256];  // Declaring a buffer on the stack 

    ZeroMemory(buffer, 256); 
    sprintf(buffer,"--------------------- Processing Side (%s) ----------------------  --- \n", (side ? "A" : "B")); 
    int nret = send(Socket, 

     buffer, 

     strlen(buffer), // Note that this specifies the length of the string; not 

       // the size of the entire buffer 

     0);   // Most often is zero, but see MSDN for other options 

如果我踏入的代碼,我發現,調試黃色箭頭消失在這條線

clientSocket = serverSocket.AcceptTcpClient(); 

C#GUI出現,雖然按鈕仍然可以按下,但它不會再次進入代碼。我從互聯網上搜索了這些代碼片段,因此可能存在我不熟悉的錯誤。任何人都可以看到我的努力出了什麼問題嗎?爲什麼調試在上面的行消失了,並且C#gui出現了?

的感謝!

感謝您的答案。我做了以下,但連接調用失敗。這是因爲端口號?在C#中它是7898.在C++中它是htons(7898),這是另一個數字。

SOCKADDR_IN server; 

server.sin_port=htons (7898); 
server.sin_family = AF_INET; 

server.sin_addr.s_addr = INADDR_ANY; 

if (bind(Socket, (SOCKADDR *)(&server), sizeof (server)) == SOCKET_ERROR) 
{ 
cout<<"BINDING FAILED\n"; 
cin.get(); 
return 0; 
} 
    //---------------------- 
// Connect to server. 
int iResult = connect(Socket, (SOCKADDR *) & server, sizeof (server)); 
if (iResult == SOCKET_ERROR) { 
    wprintf(L"connect function failed with error: %ld\n", WSAGetLastError()); 
    iResult = closesocket(Socket); 
    if (iResult == SOCKET_ERROR) 
     wprintf(L"closesocket function failed with error: %ld\n", WSAGetLastError()); 
    WSACleanup(); 
    return 1; 
} 

在C#

IPAddress localAddr = IPAddress.Parse("127.0.0.1"); 

TcpListener serverSocket = new TcpListener(localAddr,7898); 

我讀了htons文檔,並認爲該端口號是好的,而不是問題。那麼它不連接? 再次感謝!

回答

0

TcpListener.AcceptTcpClient是一個阻塞操作,意味着在客戶端連接之前不會執行其他代碼。所以你不能繼續調試,因爲這個調用永遠不會結束。

由於您將所有工作委託給後臺線程,因此GUI具有響應性。

+0

謝謝尼古拉!我相信我的客戶端是發送信息的C++ dll。我對嗎?如果是,我該如何修改代碼才能連接到正在監聽的c#服務器? – user2192008

1

在C++客戶端調用綁定之後,它必須調用connect。直到成功完成連接,呼叫發送纔會生效。

+0

也沒有理由將它綁定到0以外的任何端口(即讓OS分配一個端口)。事實上,在連接這裏之前沒有真正的理由來綁定它。 –

+0

謝謝Peter.I刪除了綁定部分,但它仍然沒有連接。爲什麼不能連接? – user2192008

0

首先,在發生連接錯誤後調用WSAGetLastError()來獲取實際的錯誤。這可能會給你一些見解。其次,由於指定了無效的大小,我懷疑你得到了10014錯誤。如果你傳遞sizeof(sockaddr)而不是sizeof(服務器),你可能會有更多的運氣。