gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 08:36:52 24 4
gpt4 key购买 nike

这是 UDP 客户端-服务器程序的服务器代码部分。在 while 循环中,我调用了 sendto() 来写入套接字。但是当我执行程序时,它说 - 'Invalid Argument'。这里的 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:修改了之前的代码。现在出现此错误。

最佳答案

你的括号位置错了。

这一行:

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

应该是这样的:

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

更重要的是,既然你已经定义了len = sizeof(cliaddr)在你的 while 循环之外并且它在循环内没有改变,你可以在你的 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");
}
}
}

关于c - 这里的 sendto() 参数有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25859112/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com