【问题标题】:recvfrom in socket programming with C使用 C 进行套接字编程的 recvfrom
【发布时间】:2014-08-12 02:50:26
【问题描述】:

所以当我遇到这段代码时,我试图理解 C 中的套接字编程:

/* Sample UDP client */

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <string.h>

int main(int argc, char**argv)
{
    int sockfd,n;
    struct sockaddr_in servaddr;
    char sendline[] = "Hello UDP server! This is UDP client";
    char recvline[1000];

    if (argc != 2)
    {
        printf("usage:  ./%s <IP address>\n",argv[0]);
        return -1;
    }

    sockfd=socket(AF_INET,SOCK_DGRAM,0);

    bzero(&servaddr,sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_addr.s_addr=inet_addr(argv[1]);
    servaddr.sin_port=htons(32000);

    sendto(sockfd,sendline,strlen(sendline),0,(struct sockaddr *)&servaddr,sizeof(servaddr));
    n=recvfrom(sockfd,recvline,10000,0,NULL,NULL);
    recvline[n]=0;
    printf("Received: %s\n",recvline);
    return 0;
}

recvfrom() 调用似乎不需要 ip 地址来发送消息。查看手册页发现以下几行:

如果 src_addr 不为 NULL,并且底层协议提供 源地址,填写这个源地址。当src_addr为 NULL,什么都不填;在这种情况下,不使用 addrlen, 也应该是NULL。

所以我认为底层协议提供了源IP地址。我的问题是,它如何真正确定接收消息的地址?是不是,一旦你向一个地址发送消息,你就不能使用同一个套接字向其他地址发送消息?这样它就一直使用同一个地址?

请帮忙。在 Google 或任何讲义中都找不到答案。

提前谢谢你。

【问题讨论】:

  • recvfrom() 不发送。顾名思义,它接收。 “它是如何确定地址的” --- 发送主机在消息中发送它的地址。协议实现将其提取并返回给程序。 “一旦将消息发送到某个地址,就不能使用同一个套接字将消息发送到其他地址” --- 这取决于协议。
  • @n.m.对不起,我犯了一个错误。应该是“接收自”而不是“发送至”。但是程序如何知道我们希望从谁那里得到消息呢?来自多个 IP 和端口的多个服务器可能同时发送消息?
  • 程序事先并不知道这一点。它被告知哪条消息从哪里到达。 address参数为out参数,由系统填写。

标签: c sockets udp recvfrom


【解决方案1】:

您有一个误解,认为recvfrom 从特定源地址提取数据。

recvfrom 通常用于 UDP 等无连接协议。当接收到 UDP 数据包时,它可能来自任何源地址。 src_addr 返回此地址供应用程序使用。

如果您只希望收到来自特定地址的消息,有两种方法。 (1)您可以通过比较src_addr中返回的地址来忽略从其他地址接收到的数据包,或者(2)使用connect指定您期望消息的特定远程地址,并且较低的套接字层负责忽略来自其他来源的数据包。连接后,你也可以使用recv代替recvfrom

发送消息是通过sendto 完成的。你似乎混淆了这两个电话。使用sendto 可以将消息发送到同一套接字上的不同地址。

【讨论】:

    猜你喜欢
    • 2013-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多