0

我是套接字程序的新手。在学习sendto函数时,作为原型:

ssize_t sendto(int socket, const void *message, size_t length,
                int flags, const struct sockaddr *dest_addr,
                socklen_t dest_len);

我知道“消息”已包含目标 IP,并且dest_addr参数还指定了目标 IP 地址。dest_addr这个论点还有其他用法吗?

4

3 回答 3

10

我认为您混淆了“消息”和“dest_addr”。

让我们看一下展开形式的 sendto 原型:

ssize_t sendto   (int sockfd,
                 const void *buf,
                 size_t length,
                 int flags,
                 const struct sockaddr *dest_addr, 
                 socklen_t addrlen);

sockfd - 这是您通过调用 socket() 创建的套接字

buf - 这是一个指向 ARRAY OF BYTES 的指针(即它们可以制作 char* 类型的 buf)。也就是说,这是您希望通过封装在 UDP 数据包中的线路发送的数据。

长度 - 这是该数组中有多少字节。如果你没有传递“length”,它就不会知道“buf”是 1 字节还是 10000 字节。

flags - 通常为 0。这是高级的东西

dest_addr - 这是一个指向目标地址的指针。通常,您初始化 sockaddr_in 实例并将其指针值转换为 sockaddr* 类型。

addrlen - dest_addr 的大小。通常,sizeof(sockaddr_in)。地址长度是可变的,因为 dest_addr 可以指向 IPV4 地址(sockaddr_in 类型)或 IPV6 地址(sockaddr_in6 类型)或其他类型。

从本地端口 9999 向远程主机“1.2.3.4”的端口 8888 发送数据包的示例。为简洁起见,省略了返回代码的错误检查。

int s;
sockaddr_in addrDest;
sockaddr_in addrLocal;
char* msg = "Hello World";

// create the socket
s = socket(AF_INET, SOCK_DGRAM, 0); // UDP socket


addrLocal.sin_family = AF_INET;
addrLocal.sin_port = htons(9999);
addrLocal.sin_addr = INADDR_ANY; // zero-init sin_addr to tell it to use all available adapters on the local host

// associate this socket with local UDP port 9999
result = bind(s, (struct sockaddr*)&addrLocal, 0);

// send "Hello world" from local port 9999 to the host at 1.2.3.4 on its port 8888
addrDest.sin_family = AF_INET;
addrDest.sin_port = htons(8888);
addrDest.sin_addr.s_addr = inet_addr("1.2.3.4");

// strlen(msg)+1 for terminating null char
result = sendto(s, msg, strlen(msg)+1, 0, (struct sockaddr*)&addrDest, sizeof(addrDest));
于 2013-05-30T09:17:03.800 回答
3

不,消息包含您将发送的内容,这是一个示例:

int spatula_count = 3490;
char *secret_message = "The Cheese is in The Toaster";

int stream_socket, dgram_socket;
struct sockaddr_in dest;
int temp;

// first with TCP stream sockets:

// assume sockets are made and connected
//stream_socket = socket(...
//connect(stream_socket, ...

// convert to network byte order
temp = htonl(spatula_count);
// send data normally:
send(stream_socket, &temp, sizeof temp, 0);

// send secret message out of band:
send(stream_socket, secret_message, strlen(secret_message)+1, MSG_OOB);

// now with UDP datagram sockets:
//getaddrinfo(...
//dest = ...  // assume "dest" holds the address of the destination
//dgram_socket = socket(...

// send secret message normally:
sendto(dgram_socket, secret_message, strlen(secret_message)+1, 0, 
       (struct sockaddr*)&dest, sizeof dest);
于 2013-05-30T09:07:23.823 回答
0

该消息不包含目标地址,仅包含有效负载字节。

除非您使用的是原始套接字……如果您不熟悉套接字编程,则不应这样做。

于 2013-05-30T09:06:50.893 回答