首页 文章

C中的套接字编程

提问于
浏览
4

好吧,所以当我使用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]错误代码,据我所知 .

但是......它的意思是什么?什么文件?什么太长了?

是不是我不能重复使用套接字来发送数据,或者我刚刚犯了另一个新错误?

最好的祝福,

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'可能应该没有通过地址传递:ie:应该只是addr_len .

相关问题