【问题标题】:Socket programming in CC中的套接字编程
【发布时间】:2009-01-20 23:07:51
【问题描述】:

好的,所以我正在尝试让一些 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发回数据,还是我又犯了一个新错误?

最好的问候,

【问题讨论】:

    标签: c sockets network-programming


    【解决方案1】:

    您不应将套接字结构长度的地址传递给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) {
    

    【讨论】:

      【解决方案2】:

      Erm,至少你在 sendto 中传递的 '&addr_len' 可能不应该通过地址传递:即:应该只是 addr_len。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-10-09
        • 2013-06-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-29
        相关资源
        最近更新 更多