首次使用套接字编程。连接没有发生。

时间:2013-10-28 16:33:07

标签: c++ sockets mfc

拜托,这是我第一次尝试使用套接字进行编程。我使用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;
            }

        }
    }

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

2 个答案:

答案 0 :(得分: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()有一个非常直接且容易理解的例子。

答案 1 :(得分: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");

此外,将port放入sockaddr_in时,请不要忘记按正确的字节顺序排列。根据{{​​1}}的值,您可能需要将代码更改为:

port