这里的sendto()参数有什么问题?

时间:2014-09-16 00:53:17

标签: c sockets udp

这是UDP客户端 - 服务器程序的服务器代码部分。在while循环中,我调用sendto()来写入套接字。但是当我执行程序时,它会说 - “无效的参数”。这里的sendto()参数有什么问题?

#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>

void error(const char *msg)
{
    perror(msg);
    exit(1);
}


int main(int argc, char**argv)
{
   int sockfd,n,newsockfd;
   struct sockaddr_in servaddr,cliaddr;
   socklen_t len;
   char mesg[1000];

   sockfd=socket(AF_INET,SOCK_DGRAM,0);
   //printf("sockfd: %d\n",sockfd);

   servaddr.sin_family = AF_INET;
   servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
   servaddr.sin_port=htons(32000);

   if(bind(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr))<0)
   {
        printf("Problem in bind function\n");
   }

   len = sizeof(cliaddr);
   while(1)
     {
         memset(mesg,0,sizeof(mesg));
         gets(mesg);
         if (sendto(sockfd,mesg,100,0,(struct sockaddr *)&cliaddr,sizeof(cliaddr) < 0))
         {
            error("Problem writing to socket");
         }

     }
}

PS:更改了上一个代码。现在收到这个错误。

1 个答案:

答案 0 :(得分:2)

你的支架位置错误。

这一行:

if (sendto(sockfd,mesg,100,0,(struct sockaddr *)&cliaddr,sizeof(cliaddr) < 0))

应该是这样的:

if ( sendto(sockfd,mesg,100,0,(struct sockaddr *)&cliaddr,sizeof(cliaddr)) < 0 )

还有什么,因为你已经在while循环之外定义了len = sizeof(cliaddr)并且它在循环中没有被更改,你可以在sendto命令中使用它而不是sizeof(cliaddr)

if ( sendto(sockfd,mesg,100,0,(struct sockaddr *)&cliaddr, len) < 0 )

修改

仔细观察后,cliaddr应替换为servaddr。客户端将消息发送到服务器sendto命令中的第五个参数指定服务器地址。

if (sendto(sockfd,mesg,strlen(mesg),0,(struct sockaddr *)&servaddr, sizeof(servaddr)) < 0)

您错过的最重要的部分是设置主机地址,即服务器IP。请尝试以下代码(它基于您的代码,但添加/修改了必要的行):

#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
# include <string.h>

// change the host address to the appropriate one, this one is a loopback address
char host[10] = "127.0.0.1";

void error(const char *msg)
{
    perror(msg);
    return;
}


int main(int argc, char**argv)
{
   int sockfd,n,newsockfd;
   struct sockaddr_in servaddr,cliaddr;
   struct hostent *sh;
   struct in_addr **addrs;
   socklen_t len;
   char mesg[1000];

   if ((sh=gethostbyname(host))==NULL) {             //get host's information
        printf("error when gethostbyname");
    }

   sockfd=socket(AF_INET,SOCK_DGRAM,0);
   printf("sockfd: %d\n",sockfd);

   addrs = (struct in_addr **)sh->h_addr_list;

   servaddr.sin_family = AF_INET;
   servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
   servaddr.sin_port=htons(32000);

   // setting address information
   memcpy(&(servaddr.sin_addr.s_addr), *addrs, sizeof(struct in_addr));
   bzero(&(servaddr.sin_zero), 8);

   if(bind(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr))<0)
   {
        printf("Problem in bind function\n");
   }

   len = sizeof(servaddr);
   while(1)
     {
         memset(mesg,0,sizeof(mesg));
         gets(mesg);
         if (sendto(sockfd,mesg,strlen(mesg),0,(struct sockaddr *)&servaddr,len) < 0)
         {
            error("Problem writing to socket");
         }
     }
}