c-recvfrom中的分段故障(创建了核心转储)



我正在写一个简单的C代码来创建一个lisening套接字。代码如下:

#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/ip.h>
void main() {
struct sockaddr_in server;
struct sockaddr_in client;
int clientlen;
char buf[1500];
int sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
memset((char *)&server, 0, sizeof(server));
server.sin_family = AF_INET;
server.sin_addr.s_addr = htonl(INADDR_ANY);
server.sin_port = htons(9090);
if(bind(sock, (struct sockaddr *) &server, sizeof(server)) < 0)
error("ERROR on binding");
while(1) {
bzero(buf, 1500);
recvfrom(sock, buf, 1500-1, 0, (struct sockaddr *) &client, &clientlen);
printf("%sn", buf);
printf("%d - %sn", client.sin_port, client.sin_addr.s_addr);
}
close(sock);
}

代码编译没有问题,但当我使用netcat:连接到带有客户端的服务器时

nc -u 10.0.2.4 9090

我发了一些消息,消息被回复了,然后我收到了错误。有人知道我为什么会有这种行为吗?非常感谢。

这里有两个主要问题。首先,在调用recvfrom之前,clientlen应该包含地址结构的大小,但它是未初始化的。因此设置如下:

int clientlen = sizeof(client);

其次,使用%s打印client.sin_addr.s_addr,但该字段不是字符串。您应该使用inet_ntoastruct inaddr_t转换为字符串:

printf("%d - %sn", ntohs(client.sin_port), inet_ntoa(client.sin_addr));

相关内容

  • 没有找到相关文章

最新更新