c - 将接口(interface)地址传递给bind的正确方法

标签 c sockets

我正在使用 UDP 应用程序,但我不确定我这样做是否正确。我需要将地址输入 addr.sin_addr.s_addr 。到目前为止我只使用过 addr.sin_addr.s_addr = htonl(INADDR_ANY)但我需要设置从用户那里获得的特定地址。当我使用addr.sin_addr.s_addr = htonl(adresa)时我做得对吗? ?

完整代码:

int main(int argv, char **argc)
{
    strcpy(adresa, "someadress");

    int optval;
    struct sockaddr_in addr;//, incoming_addr;

    /* create socket */
    sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
    if (sock < 0)
    {
        err("socket()");
    }

    /* set reusable flag */
    optval = 1;
    setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval));

    /* prepare inet address */
    memset(&addr, 0, sizeof(addr));
    addr.sin_family = AF_INET;
    addr.sin_port = htons(port);

    if(strcmp(adresa, "-") == 0)
    {
        addr.sin_addr.s_addr = htonl(INADDR_ANY); /* listen on all interfaces */        
    }
    else
    {
        addr.sin_addr.s_addr = htonl(adresa); /* listen on all interfaces */
    }


    if (bind(sock, (struct sockaddr*)&addr, sizeof(addr)) < 0)
    {
        err("bind");
    }

    for(;;)
    {

    }

    return 0;
}

最佳答案

最简单的方法是使用inet_addr函数,它可以获取 IPv4 地址并将其转换为网络字节顺序的地址,如 in_addr_t。然后可以将该值存储在 sin_addr.s_addr 中:

addr.sin_addr.s_addr = inet_addr(adresa);

关于c - 将接口(interface)地址传递给bind的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34798036/

相关文章:

multithreading - 如何将 TWSocket 的 OnDataAvailable() 事件推送到 Delphi 6 应用程序中的后台线程?

c++ - C Socket 和 Omnet++ 之间的方法名称冲突

C 从头文件导入#defines

C 中的字符比较

C++ Sockets WEB 从特权站点获取信息

java - 无法从 python 服务器向 java 客户端发送消息

postgresql - 套接字 : operation not permitted when connecting to cloudsql

c++ - 将一个输入文件与给定数量的文件匹配的算法

c - 用 void * 初始化 C 中的数组

将 float* 转换为 char*、int* 和 char* 未产生预期结果