【发布时间】: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参数,由系统填写。