服务器端用多路复用模型接收带外数据的一段代码
能正常CC通过,但一运行就出现
Memory fault - core dumpetd
搞的晚上都没心情吃火锅了
大家帮忙啊!!!
# include "unixnet.h" //自己写的一段头文件
int main(int argc,char ** argv)
{ int listen_fd,conn_fd;
int cli_len;
struct sockaddr_in cli_addr,serv_addr;
int ret;
int re_use_addr=1;
int flags,n_data;
fd_set rset,eset;
char buffer[MAXLINE];
listen_fd=socket(AF_INET,SOCK_STREAM,0);
if(listen_fd==-1)
{perror("create listen fd");exit(1);}
bzero(&serv_addr,sizeof(serv_addr));
serv_addr.sin_family=AF_INET;
serv_addr.sin_addr.s_addr=htonl(INADDR_ANY);
if(argc<2)
serv_addr.sin_port=htons(SERVER_PORT);
else
serv_addr.sin_port=htons(atoi(argv[1]));
if((flags=fcntl(listen_fd,F_GETFL,0))<0)
perror("F_GETFL error");
flags&=~O_NONBLOCK;
if(fcntl(listen_fd,F_SETFL,flags)<0)
perror("F_SETFL error");
setsockopt(listen_fd,SOL_SOCKET,SO_REUSEADDR,(void
*)&re_use_addr,sizeof(int));
ret=bind(listen_fd,(struct sockaddr *)&serv_addr,sizeof(serv_addr));
if(ret<0)
{perror("bind server port");exit(1);}
listen(listen_fd,LISTENQ);
FD_ZERO(&rset);
FD_ZERO(&eset);
conn_fd=accept(listen_fd,(struct sockaddr *)&cli_addr,&cli_len);
while(1)
{ FD_SET(conn_fd,&rset);
FD_SET(conn_fd,&eset);
ret=select(conn_fd+1,&rset,NULL,&eset,NULL);
if(ret==-1)
{perror("server select");exit(1);}
if(FD_ISSET(conn_fd,&eset))
{ printf("maybe the server received outband data\n");
n_data=recv(conn_fd,buffer,sizeof(buffer)-1,MSG_OOB);
if(n_data==-1)
{printf("server recv outband data");exit(0);}
buffer[n_data]=\0;
printf("The server read %d outband bytes %s\n",n_data,buffer);
if(buffer[0]==c)
{fprintf(stderr,"process received sleep signal \n");
sleep(15);
}
if(buffer[0]==f)
{fprintf(stderr,"process received final signal\n");
exit(0);
}
}
if(FD_ISSET(conn_fd,&rset))
{ n_data=read(conn_fd,buffer,sizeof(buffer)-1);
if(n_data==-1)
{perror("server read");exit(1);}
else if(n_data==0)
{printf("server read EOF\n");
exit(0);}
buffer[n_data]=\0;
printf("The server received %d bytes data:%s\n",n_data,buffer);
}
}
}
你既然已经把socket设置成O_NONBLOCK了,还用select干什么?
你的accept返回值应该是 -1 ,后面就不能再做select的参数了。
用dbxtra or dbx 看core文件,up 命令or down 命令找到退出点看各变量的值。80%因为出现空指针或是 数组越界。
conn_fd=accept(listen_fd,(struct sockaddr *)&cli_addr,&cli_len);
有问题的.
改为:定义cli_len时,
int cli_len = sizeof(struct socketaddr*);
即可.