【发布时间】:2019-07-11 23:17:43
【问题描述】:
当导致分段错误时,我已经搜索过,但我无法纠正代码中的错误。我正在使用 select 函数来找出哪些文件描述符是可读的。我在套接字编程方面相当新c 当我们有 ipv4 地址长度的宏时,我无法理解结构 socklen_t 的用途。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<netdb.h>
#define PORT "9034"
int main()
{
fd_set master,read_fds;
int file_descriptor,new_fd,server,yes=1,error,fd_max,i;
char ip[INET_ADDRSTRLEN],data[1024];
struct addrinfo hints,*p;
struct sockaddr_in addr;
socklen_t addrlen; //?
memset(&hints,0,sizeof(struct addrinfo));
FD_ZERO(&master);
FD_ZERO(&read_fds);
hints.ai_family=AF_INET;
hints.ai_socktype=SOCK_STREAM;
hints.ai_protocol=AI_PASSIVE;
file_descriptor=getaddrinfo(NULL,PORT,&hints,&p);
printf("%s",inet_ntop(AF_INET,p->ai_addr,ip,addrlen));
server=socket(p->ai_family,p->ai_socktype,p->ai_protocol);
setsockopt(server,SOL_SOCKET,SO_REUSEADDR,&yes,sizeof(int));
listen(server,5);
FD_SET(server,&master);
fd_max=server;
while (1)
{
read_fds=master;
select(fd_max+1,&read_fds,NULL,NULL,NULL);
for(i=0;i<fd_max;i++)
{
if(i==server)
{
new_fd=accept(server,(struct sockaddr *)&addr,&addrlen);
FD_SET(new_fd,&master);
printf("Connected to the client %s on socket %d",inet_ntop(AF_INET,(struct sockaddr *)&addr,ip,INET_ADDRSTRLEN),new_fd);
if(new_fd>fd_max)
fd_max=new_fd;
}
else
{
recv(i,data,sizeof(data),0);
printf("%s",data);
}
}
}
}
【问题讨论】:
-
代码中的seg错误发生在哪里?您的编译器中是否打开了警告?您是否在调试模式下运行,以便您可以单步执行以查看每个语句发生了什么?
-
考虑 IPv4 和 IPv6 的结构大小不同但通过相同指针传递的事实。被调用者知道它得到了什么的唯一方法是通过该大小变量。这些方法也有很多可能会失败,您需要检查文档中描述的错误情况。
-
@ryyker 出于某种原因,对象 master 和 read_fds 显示为
和 FD_SET,FD_INIT 函数将返回一个整数,当我尝试分配一个整数时,我“从不兼容的类型 'void' 分配给 'int' 时出现此错误”