首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C sendto函数调用?

C sendto函数调用?
EN

Stack Overflow用户
提问于 2017-08-25 21:08:22
回答 2查看 2.2K关注 0票数 2

我目前正在为学校作业设置一个UDP套接字,但我不知道如何正确地将sockaddr作为参数发送到函数中。SendData的输入参数的定义方式与sendto函数中相同。

代码语言:javascript
复制
void SendData(int fileDescriptor, const struct sockaddr_in *destAddrUdp, unsigned char buffer[MAXMSG])
{
  /* crc */
  int strlength = strlen(buffer);
  unsigned char SCRC = CRC(buffer, strlength-1);
  buffer[strlength-1] = SCRC;
  buffer[strlength] = '\0'; 
  /* send */
  if (sendto(fileDescriptor, buffer, strlen(buffer), 0, (struct sockaddr*) &destAddrUdp,sizeof(destAddrUdp)) < 0) {
    fprintf(stderr, "Could not send data\n");
  }
} `

当从main调用下面的代码时,它可以工作,但是当从SendData调用它时,sendto的返回值是-1。

代码语言:javascript
复制
if (sendto(fileDescriptor, buffer, strlen(buffer), 0, (struct sockaddr*) &destAddrUdp,sizeof(destAddrUdp)) < 0) {
    fprintf(stderr, "Could not send data\n");
  }

如果程序是编译的,我会收到警告:从不兼容的指针类型.中传递SendData中sendto函数调用中的“recvfrom”参数5。我的主程序中对SendData的函数调用是:SendData(sockfd, (struct sockaddr *) &destAddrUdp, buffer);

如果与此相关的主要方案:

代码语言:javascript
复制
unsigned char SCRC;
  unsigned char strlength;
  unsigned char buffer[MAXMSG-5];
  unsigned char header[MAXMSG];
  struct rtp_struct *sendstruct; 
  /* option 2 */
  struct sockaddr_in destAddrUdp;
  int sockfd; 
  char dstHost[15]; 
  printf("input host IP:\n>");
  fgets(dstHost, 15, stdin);

  /* Create socket */ 
  if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) 
    fprintf(stderr, "Can't create UDP socket\n");

  /* set configurations */
  memset (&destAddrUdp, 0, sizeof(destAddrUdp));  //set zero
  destAddrUdp.sin_family = AF_INET; //internet use
  destAddrUdp.sin_addr.s_addr = inet_addr(dstHost); //set so anyone can connect
  destAddrUdp.sin_port = htons(dstUdpPort); //set the port to use

  /* Generate CRC table */
  GenerateCRCTable();

/* get string and send */
while(1) {
    printf("\n>");
    fgets(buffer, MAXMSG, stdin);
    if(strncmp(buffer,"quit\n",MAXMSG) != 0){ //if read string == quit, see else
      strlength = strlen(buffer);
      SCRC = CRC(buffer, strlength-1);
      buffer[strlength-1] = SCRC;
      buffer[strlength] = '\0';

      SendData(sockfd, (struct sockaddr *) &destAddrUdp, buffer);
      /*if (sendto(sockfd, buffer, strlength, 0, (struct sockaddr *) &destAddrUdp,sizeof(destAddrUdp)) < 0){
        fprintf(stderr, "Could not send data\n");}*/
    }  
    else {   
      close(sockfd); 
      exit(EXIT_SUCCESS);
    }
  }
}
EN

回答 2

Stack Overflow用户

发布于 2017-08-25 21:18:05

SendData函数中,参数destAddrUdp具有const struct sockaddr_in *类型。当你打这个电话时:

代码语言:javascript
复制
sendto(fileDescriptor, buffer, strlen(buffer), 0, 
       (struct sockaddr*) &destAddrUdp, sizeof(destAddrUdp)

表达式&destAddrUdp具有const struct sockaddr_in **类型,因此指针类型不兼容。另外,sizeof(destAddrUdp)返回的是指针的大小,而不是结构的大小。

您未能解释destAddrUdpSendDatamain中的不同类型。对sendto的正确调用是:

代码语言:javascript
复制
sendto(fileDescriptor, buffer, strlen(buffer), 0, 
       (struct sockaddr*) destAddrUdp, sizeof(*destAddrUdp)
票数 2
EN

Stack Overflow用户

发布于 2017-08-25 21:15:39

问题是sizeof(destAddrUdp)(struct sockaddr*) &destAddrUdp

在您的主要功能中,destAddrUdp是一个struct sockaddr_in,但是在您的函数中,它是一个sockaddr_in*,所以您不能平等地使用它们。首先,函数中的sizeof(destAddrUdp)将给出指针的大小,其次,函数中的&destAddrUdp将给出一个destAddrUdp**。这不是你想要的。

试试sendto(fileDescriptor, buffer, strlen(buffer), 0, (struct sockaddr*) destAddrUdp,sizeof(*destAddrUdp))

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45889436

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档