gpt4 book ai didi

c - C中非套接字错误的套接字操作

转载 作者:太空狗 更新时间:2023-10-29 15:10:58 28 4
gpt4 key购买 nike

我是套接字编程的新手...我试过这个服务器端程序

#define BUFLEN 512
#define MYPORT 3456
void errorp(char* msg)
{
perror(msg);
exit(1);
}

int main()
{
struct sockaddr_in server, client;
int sock;
int slen = sizeof(server);
int clen = sizeof(client);
char *recvbuf, senbuf[BUFLEN] = {'h','e','l','l','o'};

if((sock = socket(AF_INET, SOCK_DGRAM, 0) == -1))
errorp("Socket creation failed");


printf("To the client: %s, %s", senbuf, " World");
bzero(&server, sizeof(server));

server.sin_family = AF_INET;
server.sin_port = MYPORT;
server.sin_addr.s_addr = inet_addr("127.0.0.1");
if(bind(sock, (struct sockaddr*)&server, slen)==-1)
errorp("Socket Bind Failed");
if(recvfrom(sock, recvbuf, sizeof(recvbuf), 0, (struct sockaddr*) &client, &clen) == -1)
errorp("recv from error");
printf("From the client: %s", recvbuf);

if(sendto(sock, senbuf, sizeof(senbuf), 0, (struct sockaddr*) &client, sizeof(client)) == -1)
errorp("Error in sending");

printf("To the client: %s", senbuf);
close(sock);
return 0;
}

没有编译错误但是输出是

Socket Bind Failed: Socket operation on non-socket
To the client: hello, World

请帮我看看错在哪里?并帮助摆脱它

最佳答案

错误消息说明了一切:套接字不是(有效的)套接字。

这应该会让您查看创建套接字的代码:

if((sock = socket(AF_INET, SOCK_DGRAM, 0) == -1))

上面的代码 1st 将调用 socket() 的结果与 -1 进行比较,然后将比较结果赋值给 sock。所以它要么是 0,要么是 1。调用 socket() 的结果丢失了。

代码应该是这样的:

if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1)

因为 === 绑定(bind)得更紧密。


顺便说一句,使用了 Yoda-Conditition会避免这种“打字错误”:

if (-1 == (sock = socket(AF_INET, SOCK_DGRAM, 0)))

此外,至少 clen 在传递地址时应为 socklen_t 类型,以便将值写入其中,如果预期的大小将导致失败socklen_tint(显示的代码通过)不同。

关于c - C中非套接字错误的套接字操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25590965/

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