套接字 connect() 始终成功(基于 ActiveSync 的 TCP)

发布于 2024-08-23 16:29:23 字数 1136 浏览 14 评论 0 原文

我使用 TCP/IP over ActiveSync 从 Windows CE 设备连接到 Windows XP 桌面。 无论桌面服务器应用程序是否实际运行,WinSock connect() 函数始终会成功。

以下简化代码演示了此问题:

#include "stdafx.h"
#include <Winsock2.h>

int _tmain(int argc, _TCHAR* argv[])
{
    const int Port = 5555;
    const char * HostName = "ppp_peer";  

    WSADATA wsadata;
    if (WSAStartup(MAKEWORD(1, 1), &wsadata) != 0)
        return 1;

    struct hostent * hp = gethostbyname(HostName);
    if (hp == NULL)
        return 1;

    struct sockaddr_in sockaddr;
    memset(&sockaddr, 0, sizeof(sockaddr));
    sockaddr.sin_family = AF_INET;
    sockaddr.sin_addr.s_addr = ((struct in_addr *)(hp->h_addr))->s_addr;
    sockaddr.sin_port = htons(Port);    

    int sock = socket(AF_INET, SOCK_STREAM, 0);
    if (sock == SOCKET_ERROR)
        return 1;

    int result = connect(sock, (struct sockaddr*)&sockaddr, sizeof(sockaddr));
    // result always 0 (success) here

    closesocket(sock);

    return 0;
} 

这是一个错误吗?如果没有,确定服务器实际上在线的正确方法是什么?只是尝试使用已建立的连接(接收/发送数据)?

设备:Windows CE 5.0、WinSock 2.2; 桌面:Windows XP、SP3、ActiveSync 4.5。

I'm using TCP/IP over ActiveSync to connect from Windows CE device to Windows XP desktop.
The WinSock connect() function always succeeds, no matter whether desktop server application is actually running.

The following simplified code demonstrates this issue:

#include "stdafx.h"
#include <Winsock2.h>

int _tmain(int argc, _TCHAR* argv[])
{
    const int Port = 5555;
    const char * HostName = "ppp_peer";  

    WSADATA wsadata;
    if (WSAStartup(MAKEWORD(1, 1), &wsadata) != 0)
        return 1;

    struct hostent * hp = gethostbyname(HostName);
    if (hp == NULL)
        return 1;

    struct sockaddr_in sockaddr;
    memset(&sockaddr, 0, sizeof(sockaddr));
    sockaddr.sin_family = AF_INET;
    sockaddr.sin_addr.s_addr = ((struct in_addr *)(hp->h_addr))->s_addr;
    sockaddr.sin_port = htons(Port);    

    int sock = socket(AF_INET, SOCK_STREAM, 0);
    if (sock == SOCKET_ERROR)
        return 1;

    int result = connect(sock, (struct sockaddr*)&sockaddr, sizeof(sockaddr));
    // result always 0 (success) here

    closesocket(sock);

    return 0;
} 

Is this a bug? If not, what is a correct way to determine that the server is actually online? Only to try to use the established connection (recv/send data)?

Device: Windows CE 5.0, WinSock 2.2;
Desktop: Windows XP, SP3, ActiveSync 4.5.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

放我走吧 2024-08-30 16:29:23

根据 IIRC 的说法,ActiveSync 中存在一个错误,即 WM 5.0 认为它仍然连接到 Windows 桌面电脑上的 ActiveSync 服务器,请参阅 SO 这可能提供对此的线索和/或见解,并可以解释为什么套接字连接总是成功......

From what IIRC, there is a bug in the ActiveSync in that the WM 5.0 thinks its still connected up to the ActiveSync server on the Windows desktop pc, see this answer here on SO which might provide a clue and/or insight into this and could explain why the socket connect always succeed...

像极了他 2024-08-30 16:29:23

因此,除了忽略此问题并尝试使用此连接之外,我没有找到检查这是否是“真实”连接的方法。如果它不是“真实的”,通信就会失败。

So, I did not find the way to check if this is 'real' connection, other than to ignore this issue and try to use this connection. If it is not 'real', the communication will fail.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文