好的,所以我试图让一些UDP代码正常工作,而且当我使用C进行网络编程时,我几乎不是绿色的。我正在使用here中的示例文件
基本上我只是在监听给定端口上的传入UDP数据包然后我想以相同的方式发送一些数据。以下是相关部分。
此时套接字已设置并绑定到选择的端口并等待传入的数据包:
printf("GSProxy: waiting to recvfrom...\n");
addr_len = (socklen_t) sizeof their_addr;
if ((numbytes = recvfrom(sockfd, buf, MAXBUFLEN-1 , 0,
(struct sockaddr *)&their_addr, &addr_len)) == -1) { // argument 6 gives a warning but is correct int
perror("recvfrom");
exit(1);
}
printf("GSProxy: got packet from %s\n",
inet_ntop(their_addr.ss_family,
get_in_addr((struct sockaddr *)&their_addr), s, sizeof s));
printf("GSProxy: packet is %d bytes long\n", numbytes);
buf[numbytes] = '\0';
printf("GSProxy: packet contains \"%s\"\n", buf);
char retmsg[] = "Hello!";
if ((numbytes = sendto(sockfd, retmsg, 7, 0,
(struct sockaddr *) &their_addr, &addr_len)) == -1) {
perror("GSPProxy: sendto");
exit(1);
}
printf("GSProxy: Sent %i bytes.\n", numbytes);
我只想发送“你好!”字符串直接发送给发件人。
此操作失败,错误为“GSPProxy: sendto: File name too long
”。这是[ENAMETOOLONG]错误代码,据我所知。
但......这是什么意思?什么文件?什么太长了?
是不是我不能重复使用socket来发回数据,还是我刚刚犯了一个新的错误?
致以最诚挚的问候,
答案 0 :(得分:14)
您不应该将套接字结构长度的地址传递给sendto()
- 它需要实际长度(即"addr_len"
,而不是"&addr_len"
)。
将长度的地址传递给recvfrom()
的原因是,如果真实地址恰好更短,则该功能会更改。
换句话说,替换:
if ((numbytes = sendto (sockfd, retmsg, 7, 0,
(struct sockaddr *) &their_addr, &addr_len)) == -1) {
使用:
if ((numbytes = sendto (sockfd, retmsg, 7, 0,
(struct sockaddr *) &their_addr, addr_len)) == -1) {
答案 1 :(得分:1)
嗯,至少你传递给sendto的'& addr_len'可能应该没有通过地址传递:ie:应该只是addr_len。