2011-07-14 48 views
1

当我尝试将客户端连接到服务器时,我总是收到无效参数错误。一些在线的线程说,当addrlen不正确时可能会发生这种情况,但是在计算长度后,我试图将其更改为字面值,但这并不起作用。我也试过strlen(),但没有运气。不管怎么说,相关的代码 -连接时BSD套接字无效参数

服务器 -

struct sockaddr name; 
int main(int agrc, char** argv) { 

    int sock, new_sd, adrlen; //sock is this socket, new_sd is connection socket 

    name.sa_family = AF_INET; 
    strcpy(name.sa_data, "127.0.0.1"); 
    adrlen = strlen(name.sa_data) + sizeof(name.sa_family); 

    //make socket 
    sock = socket(AF_INET, SOCK_STREAM, 0); 

    if (sock < 0) { 
     printf("\nBind error %m", errno); 
     exit(1); 
    } 

    //unlink and bind 
    unlink("127.0.0.1"); 
    if(bind (sock, &name, adrlen) < 0) 
     printf("\nBind error %m", errno); 

    //listen 
    if(listen(sock, 5) < 0) 
     printf("\nListen error %m", errno); 

    //accept 
    new_sd = accept(sock, &name, (socklen_t*)&adrlen); 
    if(new_sd < 0) { 
     printf("\nAccept error %m", errno); 
     exit(1); 
    } 

客户端 -

int main(int agrc, char** argv) { 

    int sock, new_sd, adrlen; 

    sock = socket(AF_INET, SOCK_STREAM, 0); 

    if (sock < 0) { 
     printf("\nserver socket failure %m", errno); 
     exit(1); 
    } 

    //stuff for server socket 
    name.sa_family = AF_INET; 
    strcpy(name.sa_data, "127.0.0.1"); 
    adrlen = strlen(name.sa_data) + sizeof(name.sa_family); 

    cout<<"\nadrlen: "<<adrlen<<"\n"; 
    if(connect(sock, &name, adrlen) < 0) { 
     printf("\nclient connection failure %m", errno); 
     exit(1); 
    } 

我没有看到任何东西,可能是错的,但我想我可能只是忽视的东西或不知道的一些东西。任何帮助表示赞赏。

回答

0

那么你的大问题是完全误解了sockaddr结构!

首先使用sockaddr_in

你可以这样写代码更类似如下:

sockaddr_in sai; 
sai.sin_family = AF_INET; 
sai.sin_port = htons(12345); /// Or whatever port you wish to use. 
inet_aton("127.0.0.1", &sai.sin_addr.s_addr); 

注:htons转换短值从主机到网络格式。主持人可以是大的或小端的。网络是大端。

1
strcpy(name.sa_data, "127.0.0.1"); 

真的吗?地址应该是32位IPv4地址,而不是字符串。

这是AF_INET结构(从here):

// IPv4 AF_INET sockets: 

struct sockaddr_in { 
    short   sin_family; // e.g. AF_INET, AF_INET6 
    unsigned short sin_port;  // e.g. htons(3490) 
    struct in_addr sin_addr;  // see struct in_addr, below 
    char    sin_zero[8]; // zero this if you want to 
}; 

struct in_addr { 
    unsigned long s_addr;   // load with inet_pton() 
};