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;
            }

        }
    }

如果有人可以帮助我,我会很高兴。

4

2 回答 2

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 文档connect()有一个非常直接且易于理解的示例。

于 2013-10-28T17:01:56.153 回答
0

你把事情搞混了。您需要bind()传入的套接字,而不是传出的套接字。您需要连接传出套接字,而不是传入套接字。所以请只使用connect,而不是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);
于 2013-10-28T16:37:36.000 回答