1

因此,当我遇到以下代码时,我试图理解 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 或任何讲义中都找不到答案。

先感谢您。

4

1 回答 1

4

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

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

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

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

于 2014-06-21T15:10:36.793 回答