2013-10-28 87 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

相关问题