好的,所以我试图让一些UDP代码正常工作,当涉及到使用C的网络编程时,我几乎不是绿色的.我正在使用此处的示例文件
基本上我只是在侦听给定端口上的传入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]错误代码,据我所知.
但是......**是什么意思?什么文件?什么太长了?
是不是我不能重复使用套接字来发送数据,或者我刚刚犯了另一个新错误?
最好的祝福,
您不应该将套接字结构长度的地址传递给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) {