当前位置:首页
开发技术指南» 文章正文
    引言:
 

 

 ·拨号传输数据    »显示摘要«
    摘要: 各位大虾,我想实现一个拨号传输数据的程序,但是现在一点头绪都没有, 不知道哪位能给一点提示? ......
    摘要: 请教高手:保存数据中包含和"出现错误,请教如何保存? ......


Memory fault - core dumpetd 100分请高手相助,在线等,谢谢

服务器端用多路复用模型接收带外数据的一段代码    
  能正常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);    
  }    
  }    
  }

NO.1   作者: wabc

你既然已经把socket设置成O_NONBLOCK了,还用select干什么?  
  你的accept返回值应该是   -1   ,后面就不能再做select的参数了。

NO.2   作者: stvk

用dbxtra   or   dbx   看core文件,up   命令or   down   命令找到退出点看各变量的值。80%因为出现空指针或是   数组越界。

NO.3   作者: ari

conn_fd=accept(listen_fd,(struct   sockaddr   *)&cli_addr,&cli_len);    
  有问题的.  
  改为:定义cli_len时,  
  int   cli_len   =   sizeof(struct   socketaddr*);  
  即可.    
 


    摘要: 请教高手:保存数据中包含和"出现错误,请教如何保存? ......
» 本期热门文章:

©2000-2007 All Rights Reserved. 最佳浏览:1024X768 MSIE