【问题标题】:Receiving UDP packets in C在C中接收UDP数据包
【发布时间】:2009-11-12 20:25:44
【问题描述】:

我一直在尝试使用 winsock2 包在 ms Visual Studio 2008 中执行此操作,但每当我尝试解析有效​​的输入 ip 地址时,我都会收到“无效 ip...”错误。我唯一的猜测是存在一些权限错误,但我真的不知道出了什么问题。请帮忙!

if(WSAStartup(MAKEWORD(2,2), &wsaData) != 0){
    error("WSAStartup() failed\n\r");
}

// validate port
if( port <= 0 || port > 65535){
    sprintf(msg, "Invalid port - %d. Ports must be between 0 and 65536\n\r",
                    port);
    error(msg);
}

// validate ip
    inet_addr = inet_addr(ip);
if( inet_addr == INADDR_NONE){
    sprintf(msg, "Not an ip - %s\n\r", ip);
    error(msg);
} else {
        info = gethostbyaddr((char*)&inet_addr, 4, PF_INET);
    if(info == NULL){
        sprintf(msg, "Invalid ip - %s\n\r", ip);
        error(msg);
    }
}

【问题讨论】:

    标签: c sockets udp


    【解决方案1】:

    你需要链接ws2_32.lib:

    #pragma comment(lib, "ws2_32.lib")
    

    或者将其作为附加的链接器输入放入您的项目配置中。

    【讨论】:

      【解决方案2】:

      检查您是否链接到 ws2_32.lib。我相信这就是您所需要的。

      【讨论】:

        【解决方案3】:

        除非有令人信服的理由保持 Winsock 2.0 兼容级别(在非常旧的 Windows 版本上运行;使用依赖于旧 Winsock 行为的其他代码等),否则您可能还需要考虑更改:

        if(WSAStartup(MAKEWORD(2,0), &wsaData) != 0){

        if(WSAStartup(MAKEWORD(2,2), &wsaData) != 0){

        2.2 是 Winsock API 的最新版本。

        【讨论】:

          【解决方案4】:

          端口号 sin_port 也需要按网络字节顺序排列,否则您会将套接字绑定到与您想象的完全不同的端口。使用 htons() 并查看其他示例。

          (这只适用于 little-endian 系统,但无论如何都是个好主意。大多数 Windows 系统都是 little-endian。)

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-12-29
            • 1970-01-01
            • 2019-01-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-11-26
            相关资源
            最近更新 更多