编程论坛's Archiver

volanda 发表于 2007-6-13 16:17

linux socket connect 错误~

<P>刚接触socket,找了个简单的程序学习,但编译通过了,在执行服务器后返回了server socket name,然后运行客户端时出现错误:client connet: no route to host <BR>我查了connect的错误类型,说是ICMP错误:不可路由(soft error)(目的地不可达)<BR>我是在一台机器上即作服务器又做客户端   这个问题该如何解决呢。谢谢!!</P>
<P><BR>///////server<BR>#include   &lt;stdio.h&gt;   <BR>  #include   &lt;string.h&gt;   <BR>  #include   &lt;errno.h&gt;   <BR>  #include   &lt;sys/types.h&gt;   <BR>  #include   &lt;sys/socket.h&gt;   <BR>  #include   &lt;netinet/in.h&gt;   <BR>  #include   &lt;arpa/inet.h&gt;   <BR>  #include   &lt;sys/select.h&gt;   <BR>    <BR>  #define   MAX_BUF_SIZE 1024   <BR>  static   char   buf[MAX_BUF_SIZE];   <BR>    <BR>  int   display_address(const   char   *msg,   struct   sockaddr_in*   p_sin)   <BR>  {   <BR>  if(p_sin-&gt;sin_family   !=   AF_INET)     <BR>  {             <BR>  fprintf(stderr,   "Not   an   Internet   socket.\n");             <BR>  return   -1;   <BR>  }   <BR>  fprintf(stdout,   "%s   ==&gt;   address   is:   %s   :   %d\n",   msg,   inet_ntoa(p_sin-&gt;sin_addr),   ntohs(p_sin-&gt;sin_port));   <BR>      return   0;   <BR>  }   <BR>    <BR>  int   main()   <BR>  {   <BR>  int   sock,   serv;   <BR>  struct   sockaddr_in   sin;   <BR>  int   size;   <BR>  fd_set   set;   <BR>    <BR>  FD_ZERO(&amp;set);   <BR>    <BR>  serv   =   socket(AF_INET,   SOCK_STREAM,   0);   <BR>  if   (serv   ==   -1)   <BR>  {   <BR>  perror("server   socket");   <BR>  return   -1;   <BR>  }   <BR>    <BR>  memset(&amp;sin,   0,   sizeof(sin));   <BR>  sin.sin_family   =   AF_INET;   <BR>  sin.sin_addr.s_addr   =   htonl(INADDR_ANY);   <BR>  sin.sin_port   =   htons(1685);   <BR>    <BR>  if   (bind(serv,   (struct   sockaddr   *)&amp;sin,   sizeof(sin))   ==   -1)   <BR>  {   <BR>  perror("server   bind");   <BR>  return   -1;   <BR>  }       <BR>    <BR>  listen(serv,   5);   <BR>    <BR>  memset(&amp;sin,   0,   sizeof(sin));   <BR>  size   =   sizeof(sin);   <BR>  if   (getsockname(serv,   (struct   sockaddr   *)&amp;sin,   &amp;size)   ==   -1)   <BR>  perror("serv   sockname");   <BR>  display_address("server   socket   name",   &amp;sin);   <BR>  sock   =   accept(serv,   NULL,   NULL);   <BR>    <BR>  if   (sock   !=   -1)   <BR>  {   <BR>  memset(&amp;sin,   0,   sizeof(sin));   <BR>  size   =   sizeof(sin);   <BR>  if   (getpeername(sock,   (struct   sockaddr   *)&amp;sin,   &amp;size)   ==   -1)   <BR>  perror("sock   peername");   <BR>  display_address("sock   peer   name",   &amp;sin);   <BR>  memset(&amp;sin,   0,   sizeof(sin));   <BR>  size   =   sizeof(sin);   <BR>  if   (getsockname(sock,   (struct   sockaddr   *)&amp;sin,   &amp;size))   <BR>  perror("sock   sockname");   <BR>  display_address("sock   socket   name",   &amp;sin);   <BR>    <BR>  //sleep(1);   <BR>  while(1)   <BR>  {   <BR>  FD_SET(sock,   &amp;set);   <BR>  select(FD_SETSIZE,   &amp;set,   NULL,   NULL,   NULL);   <BR>  size   =   recv(sock,   buf,   MAX_BUF_SIZE,   0);   <BR>  if   (size   &lt;=   0)   <BR>  break;   <BR>  printf("server   recv   %d   bytes\n",   size);   <BR>  }   <BR>  }   <BR>  //printf("server   recv   %d   bytes\n",   size);   <BR>  close(serv);   <BR>  close(sock);   <BR>  }   <BR>////////client<BR>#include   &lt;stdio.h&gt;   <BR>  #include   &lt;string.h&gt;   <BR>  #include   &lt;errno.h&gt;   <BR>  #include   &lt;sys/types.h&gt;   <BR>  #include   &lt;sys/socket.h&gt;   <BR>  #include   &lt;netinet/in.h&gt;   <BR>  #include   &lt;arpa/inet.h&gt;   <BR>    <BR>  #define   MAX_BUF_SIZE (300)   <BR>  static   char   buf[MAX_BUF_SIZE]   =   {1,   2,   3,   4,   5,   6,   7,   8,   9,   0};   <BR>    <BR>  int   main()   <BR>  {   <BR>  int   sock;   <BR>  struct   sockaddr_in   sin;   <BR>  int   size;   <BR>    <BR>  sock   =   socket(AF_INET,   SOCK_STREAM,   0);   <BR>  if   (sock   ==   -1)   <BR>  {   <BR>  perror("client   socket");   <BR>  return   -1;   <BR>  }   <BR>    <BR>  memset(&amp;sin,   0,   sizeof(sin));   <BR>  sin.sin_family   =   AF_INET;   <BR>  sin.sin_addr.s_addr   =   inet_addr("192.168.21.207");   <BR>  sin.sin_port   =   htons(1685);   <BR>    <BR>  if   (connect(sock,   (struct   sockaddr   *)&amp;sin,   sizeof(sin))   ==   -1)   <BR>  {   <BR>  perror("client   connect");   <BR>  return   -1;   <BR>  }   <BR>  size   =   0;   <BR>  if   (sock   !=   -1)   <BR>  {   <BR>  size   +=   send(sock,   buf,   MAX_BUF_SIZE,   0);   <BR>  size   +=   send(sock,   buf,   MAX_BUF_SIZE,   0);   <BR>  size   +=   send(sock,   buf,   MAX_BUF_SIZE,   0);   <BR>  size   +=   send(sock,   buf,   MAX_BUF_SIZE,   0);   <BR>  size   +=   send(sock,   buf,   MAX_BUF_SIZE,   0);   <BR>  }   <BR>  printf("client   send   %d   bytes\n",   size);   <BR>  close(sock);   <BR>  }</P>

penguinlinux 发表于 2007-9-7 09:21

首先,加入 #include &lt;unistd.h&gt; ;并在close后加入return 0; 否则在编译的时候有 Warning<br>其次,将sin.sin_addr.s_addr   =   inet_addr("192.168.21.207"); 改为sin.sin_addr.s_addr   =   inet_addr("127.0.0.1");<br>     即是本机的环路地址。<br>

页: [1]

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.