C语言中的Socket编程

4

好的,我正在尝试编写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);

我只想将字符串“Hello!”直接发送回发件人。
这会出现错误“GSPProxy:sendto:文件名过长”。就我所知,这是[ENAMETOOLONG]错误代码。
但是……这是什么意思?哪个文件?什么太长了?
是因为我不能重复使用套接字来发送数据回去,还是我犯了另一个新手错误?
此致敬礼。
2个回答

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
嗯,至少在sendto中传递的'&addr_len'可能不应该通过地址传递:即应该只传递addr_len。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接