【问题标题】:I have problems with passing values to recvfrom and sendto functions in c我在将值传递给 c 中的 recvfrom 和 sendto 函数时遇到问题
【发布时间】:2014-05-03 17:12:49
【问题描述】:

当编译器达到reliableRecv 我得到一个eroor 当编译器达到reliableRecv 我得到一个eroor

 int rvsock;

    rvsock = socket(AF_INET,SOCK_DGRAM,0);
struct sockaddr_in saddr;
struct sockaddr_in caddr;

if (rvsock < 0){
    perror("Failed to create the socket!!");
    exit(1);
}   

//we mark the memory pointed by saddr with 0
memset(&saddr,0,sizeof(saddr) );

saddr.sin_family = AF_INET;
saddr.sin_addr.s_addr = INADDR_ANY;
saddr.sin_port = htons(port);

err = bind(rvsock, (struct sockaddr*)&saddr,sizeof(struct sockaddr_in));
if(err < 0){
    perror("Failed to bind");
    exit(1);
}

unsigned int len;
len = sizeof(struct sockaddr_in);

reliableRecv(rvsock,filename,1024,(struct sockaddr*)&caddr,(size_t *)&len);

reliableRecv 是这样定义的

 int reliableRecv(int sockfd,void* buffer,size_t bufferlen,struct sockaddr      *src_addr,size_t *srclen)
{
    int n=recvfrom(sockfd,buffer,bufferlen,0,src_addr,&srclen);
    return n;
}    

【问题讨论】:

  • 请发布您的所有代码、调用编译器的方式以及错误。
  • '我得到一个错误'。嗯,那就很清楚了。
  • “我收到错误”不是可接受的问题描述。您应该在此处发布错误消息。将其编辑到您的问题中。

标签: c sockets udp


【解决方案1】:

我看到两个问题:

  1. 你假装 unsigned longsize_t 这不一定准确:

    unsigned int len;
    len = sizeof(struct sockaddr_in);
    
    reliableRecv(rvsock,filename,1024,(struct sockaddr*)&caddr,(size_t *)&len);
    

    你应该使用:

    size_t len = sizeof(struct sockaddr_in);
    int nbytes = reliableRecv(rvsock, filename, 1024, (struct sockaddr *)&caddr, &len);
    

    通常,您应该避免将void *(或各种char * 类型之一)以外的指针转换为其他指针类型。然而,struct sockaddr * 演员表是必要的,并且“无害”,即使从大多数角度来看,它也是不可取的。套接字接口是在void * 成为选项之前设计的。

  2. 您将 size_t ** 传递给需要 size_t * 的函数:

    int reliableRecv(int sockfd, void *buffer, size_t bufferlen, struct sockaddr *src_addr, size_t *srclen)
    {
        int n=recvfrom(sockfd,buffer,bufferlen,0,src_addr,&srclen);
        return n;
    }
    

    你应该使用:

    int reliableRecv(int sockfd, void *buffer, size_t bufferlen,
                     struct sockaddr *src_addr, size_t *srclen)
    {
        int n = recvfrom(sockfd, buffer, bufferlen, 0, src_addr, srclen);
        return n;
    }
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-23
    • 1970-01-01
    • 1970-01-01
    • 2013-02-02
    • 2015-01-07
    • 2012-06-17
    • 1970-01-01
    相关资源
    最近更新 更多