所以当我遇到这段代码时,我试图理解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或任何讲义中找到答案。
提前谢谢你。
答案 0 :(得分:2)
您误以为recvfrom
从特定的源地址中提取数据。
recvfrom
通常用于UDP等无连接协议。收到UDP数据包时,它可以来自任何源地址。 src_addr
返回此地址以供应用程序使用。
如果您只期望来自特定地址的消息,则有两种方法。 (1)您可以通过比较src_addr
中返回的地址来忽略从其他地址收到的数据包,或者(2)使用connect
来指定您期望消息的特定远程地址和更低的地址套接字层负责忽略来自其他源的数据包。连接后,您还可以使用recv
代替recvfrom
。
通过sendto
发送消息。你好像混淆了2个电话。使用sendto
可以将消息发送到同一套接字上的差异地址。