首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 操作系统 > UNIXLINUX >

linux socket 运行异常

2012-02-10 
linux socket 运行错误下面是我socket的服务器和客户端的程序,编译通过了,在执行服务器后返回了serversock

linux socket 运行错误
下面是我socket的服务器和客户端的程序,编译通过了,在执行服务器后返回了server   socket   name,然后运行客户端时出现错误:client   connet:   no   route   to   host  
我查了connect的错误类型,说是ICMP错误:不可路由(soft   error)(目的地不可达)
我是在一台机器上即作服务器又做客户端       这个问题该如何解决呢。谢谢!!


///////server
#include       <stdio.h>      
    #include       <string.h>      
    #include       <errno.h>      
    #include       <sys/types.h>      
    #include       <sys/socket.h>      
    #include       <netinet/in.h>      
    #include       <arpa/inet.h>      
    #include       <sys/select.h>      
       
    #define       MAX_BUF_SIZE   (1024)      
    static       char       buf[MAX_BUF_SIZE];      
       
    int       display_address(const       char       *msg,       struct       sockaddr_in*       p_sin)      
    {      
    if(p_sin-> sin_family       !=       AF_INET)          
    {                          
    fprintf(stderr,       "Not       an       Internet       socket.\n ");                          
    return       -1;      
    }      
    fprintf(stdout,       "%s       ==>       address       is:       %s       :       %d\n ",       msg,       inet_ntoa(p_sin-> sin_addr),       ntohs(p_sin-> sin_port));      
            return       0;      
    }      
       
    int       main()      
    {      
    int       sock,       serv;      
    struct       sockaddr_in       sin;      
    int       size;      
    fd_set       set;      
       
    FD_ZERO(&set);      
       
    serv       =       socket(AF_INET,       SOCK_STREAM,       0);      
    if       (serv       ==       -1)      
    {      
    perror( "server       socket ");      


    return       -1;      
    }      
       
    memset(&sin,       0,       sizeof(sin));      
    sin.sin_family       =       AF_INET;      
    sin.sin_addr.s_addr       =       htonl(INADDR_ANY);      
    sin.sin_port       =       htons(1685);      
       
    if       (bind(serv,       (struct       sockaddr       *)&sin,       sizeof(sin))       ==       -1)      
    {      
    perror( "server       bind ");      
    return       -1;      
    }              
       
    listen(serv,       5);      
       
    memset(&sin,       0,       sizeof(sin));      
    size       =       sizeof(sin);      
    if       (getsockname(serv,       (struct       sockaddr       *)&sin,       &size)       ==       -1)      
    perror( "serv       sockname ");      
    display_address( "server       socket       name ",       &sin);      
    sock       =       accept(serv,       NULL,       NULL);      
       
    if       (sock       !=       -1)      
    {      
    memset(&sin,       0,       sizeof(sin));      
    size       =       sizeof(sin);      
    if       (getpeername(sock,       (struct       sockaddr       *)&sin,       &size)       ==       -1)      
    perror( "sock       peername ");      
    display_address( "sock       peer       name ",       &sin);      
    memset(&sin,       0,       sizeof(sin));      
    size       =       sizeof(sin);      
    if       (getsockname(sock,       (struct       sockaddr       *)&sin,       &size))      
    perror( "sock       sockname ");      
    display_address( "sock       socket       name ",       &sin);      


       
    //sleep(1);      
    while(1)      
    {      
    FD_SET(sock,       &set);      
    select(FD_SETSIZE,       &set,       NULL,       NULL,       NULL);      
    size       =       recv(sock,       buf,       MAX_BUF_SIZE,       0);      
    if       (size       <=       0)      
    break;      
    printf( "server       recv       %d       bytes\n ",       size);      
    }      
    }      
    //printf( "server       recv       %d       bytes\n ",       size);      
    close(serv);      
    close(sock);      
    }      
////////client
#include       <stdio.h>      
    #include       <string.h>      
    #include       <errno.h>      
    #include       <sys/types.h>      
    #include       <sys/socket.h>      
    #include       <netinet/in.h>      
    #include       <arpa/inet.h>      
       
    #define       MAX_BUF_SIZE   (300)      
    static       char       buf[MAX_BUF_SIZE]       =       {1,       2,       3,       4,       5,       6,       7,       8,       9,       0};      
       
    int       main()      
    {      
    int       sock;      
    struct       sockaddr_in       sin;      
    int       size;      
       
    sock       =       socket(AF_INET,       SOCK_STREAM,       0);      
    if       (sock       ==       -1)      
    {      
    perror( "client       socket ");      
    return       -1;      
    }      
       
    memset(&sin,       0,       sizeof(sin));      
    sin.sin_family       =       AF_INET;      


    sin.sin_addr.s_addr       =       inet_addr( "192.168.21.207 ");      
    sin.sin_port       =       htons(1685);      
       
    if       (connect(sock,       (struct       sockaddr       *)&sin,       sizeof(sin))       ==       -1)      
    {      
    perror( "client       connect ");      
    return       -1;      
    }      
    size       =       0;      
    if       (sock       !=       -1)      
    {      
    size       +=       send(sock,       buf,       MAX_BUF_SIZE,       0);      
    size       +=       send(sock,       buf,       MAX_BUF_SIZE,       0);      
    size       +=       send(sock,       buf,       MAX_BUF_SIZE,       0);      
    size       +=       send(sock,       buf,       MAX_BUF_SIZE,       0);      
    size       +=       send(sock,       buf,       MAX_BUF_SIZE,       0);      
    }      
    printf( "client       send       %d       bytes\n ",       size);      
    close(sock);      
    }      


[解决办法]
你的代码我看了, 没什么大错误, 不过看着象是从Linux C函数手册中抄袭的.
发现一个错误:
sin.sin_addr.s_addr = inet_addr( "192.168.21.207 ");
inet_addr()返回的是unsigned long类型, 而socketaddr_in结构的定义是:
struct socketaddr_in
{
unsigned short int sin_family;
uint16_t sin_port;
struct in_addr sin_addr;
unsigned char sin_zero[8];
};
可见, sin_addr类型是struct in_addr.
所以你要用:
int inet_aton(const char * cp,struct in_addr *inp);
来实现转换.
你试试先.

热点排行