2013-10-28 115 views
0

請,這是我第一次嘗試使用套接字進行編程。我使用C++ MFC工作,並試圖讓應用程序通過其TCP/IP地址與視頻服務器控制器進行通信。第一次使用套接字進行編程。連接沒有發生。

我做了所有的第一步沒有錯誤。我創建一個套接字,我調用bind()函數來關聯地址,但是當我嘗試連接它時不起作用。

我不知道如果我做錯了什麼,所以我把我的代碼的一部分下面。

struct sockaddr_in my_addr; 
    int lenAddrs; 

    b1 = 192; 
    b2 = 168; 
    b3 = 11; 
    b4 = 2; 

    remoteAddress.Format("%u.%u.%u.%u", b1, b2, b3, b4); 

    port = (u_short)(portNumber); 

    // my address 
    memset(&my_addr, 0, sizeof(my_addr)); 
    my_addr.sin_family = AF_INET; 
    my_addr.sin_port = htons(port); 
    lenAddrs = sizeof(my_addr); 


    // remote address 
    memset(&remote_addr, 0, sizeof(remote_addr)); 
    remote_addr.sin_family = AF_INET; 
    remote_addr.sin_port = port; 
    inet_pton(AF_INET, remoteAddress, (&remote_addr.sin_addr)); 

    // socket 
    sckSloMo = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 

    if (sckSloMo == INVALID_SOCKET) 
    { 
     AfxMessageBox("sckSloMo is invalid!!"); 
     return; 
    } 

    if (sckSloMo != SOCKET_ERROR) 
    { 
     ret = bind(sckSloMo, (const sockaddr*) &my_addr, sizeof(my_addr)); 

     if (ret == 0) 
     { 
      ret = connect(sckSloMo, (const sockaddr*) &remote_addr, sizeof(remote_addr)); 
      if (ret == 0) 
      { 
       AfxMessageBox("connect!"); 
       StartSendingMessages(); 
      } 
      else 
      { 
       AfxMessageBox("connect error!!!"); 
       return; 
      } 

     } 
    } 

如果有人能幫助我,我會很高興。

+1

您在'bind'和'connect'中使用相同的'sockaddr'結構。這沒有任何意義。通常,不會在客戶端套接字上調用「bind」。在'connect'中,您將要連接的服務器地址**傳遞給**。我沒有看到你在哪裏拼出目標IP地址。 –

+0

你不需要使用'bind'。看看[MSDN文檔連接](http://msdn.microsoft.com/en-us/library/windows/desktop/ms737625(v = vs.85).aspx)。如果你在'connect'不起作用時提供'WSAGetLastError()'的結果會有所幫助。 – ajcaruana

回答

0

你在攪拌東西。您需要bind()用於傳入套接字,而不是用於傳出套接字。您需要連接傳出套接字,而不是傳入套接字。所以請只使用連接,而不是bind()

您未初始化remote_addr.sin_addr。這不起作用。如果你沒有明確地初始化它,那麼你的memset(,0,)仍然是0.0.0.0。雖然0.0.0.0是綁定(意味着綁定到所有網卡)的理想選擇,但它不是連接的有效目標地址。

設置remote_addr.sin_addr示例代碼:

remote_addr.sin_addr = inet_addr("192.168.11.2"); 

而且,把portsockaddr_in的時候,請不要忘記把它在正確的字節順序。取決於port價值,您可能需要更改您的代碼:

remote_addr.sin_port = htons(port); 
+0

嘿,夥計們。我把代碼做了一些我試圖做出的改變。有了這些更改,錯誤仍在發生。我不知道可能會造成這種情況。 – user2928858

1

試試這個:

struct sockaddr_in remote_addr; 
int lenAddrs; 

b1 = 192; 
b2 = 168; 
b3 = 11; 
b4 = 2; 

remoteAddress.Format("%u.%u.%u.%u", b1, b2, b3, b4); 

port = (u_short)(portNumber); 

// remote address 
memset(&remote_addr, 0, sizeof(remote_addr)); 
remote_addr.sin_family = AF_INET; 
remote_addr.sin_port = htons(port); 
inet_pton(AF_INET, remoteAddress, (&remote_addr.sin_addr)); 

// socket 
sckSloMo = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 

if (sckSloMo == INVALID_SOCKET) 
{ 
    AfxMessageBox("sckSloMo is invalid!!"); 
    return; 
} 

if (sckSloMo != SOCKET_ERROR) 
{ 
    ret = connect(sckSloMo, (const sockaddr*) &remote_addr, sizeof(remote_addr)); 
    if (ret == 0) 
    { 
     AfxMessageBox("connect!"); 
     StartSendingMessages(); 
    } 
    else 
    { 
     AfxMessageBox("connect error!!!"); 
     return; 
    } 
} 

正如別人已經,正確地指出,港口的價值不在正確的字節順序。此外,您不需要在客戶端套接字上使用bind()MSDN docuemntation for connect()有一個非常簡單易用的例子。

+0

謝謝大家! IT WORKED = D – user2928858

相關問題