在C中接收UDP数据包

时间:2009-11-12 20:25:44

标签: c sockets udp

我一直在尝试使用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);
    }
}

4 个答案:

答案 0 :(得分:4)

您需要与ws2_32.lib

相关联
#pragma comment(lib, "ws2_32.lib")

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

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

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

2.2是Winsock API的最新版本。

答案 3 :(得分:1)

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

(这仅适用于小端系统,但无论如何都是个好主意。大多数Windows系统都是小端的。)