2012-11-27 56 views
-1

這是我的代碼綁定()得到的Linux網絡編程

#include "basic.h" 
#include "bp_socket.h" 

int setup_tcp(char *port) 
{ 
    struct sockaddr_in server_addr; 
    in_port_t server_port; 
    int sock; 
    int retval;      //return value 

    if ((server_port = atoi(port)) < 0) 
    { 
     server_port = (in_port_t)DEFAULT_PORT; 
     fprintf(stderr, "Error port: %d in line %d\n", (int)server_port, __LINE__); 
     //fprintf(stderr, "Use default port: %d\n", DEFAULT_PORT); 
    } 

    sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 
    if (sock < 0) 
    { 
     return sock; 
    } 

    retval = listen(sock, 40); 
    if (retval < 0) 
    { 
     return retval; 
    } 

    memset(&server_addr, 0, sizeof(struct sockaddr_in)); 
    server_addr.sin_addr.s_addr = htonl(INADDR_ANY); 
    server_addr.sin_port  = htons(server_port); 
    server_addr.sin_family  = AF_INET; 
    retval = bind(sock, (struct sockaddr*)&server_addr, sizeof(server_addr)); 
    if (retval < 0) 
    { 
     perror("bind"); 
     return retval; 
    } 

    return sock; 
} 

int main() 
{ 
    printf("%d\n", setup_tcp("4558")); 
    perror(""); 
    return 0; 
} 

調試我的代碼「無效參數」的錯誤,後來我發現bind()-1

我谷歌,讀手冊頁,但我找不到我的答案。

功能setup_tcp是創建套接字,並與地址綁定。

然後返回a socketerrno value

如何解決它。我曾多次閱讀我的代碼。

謝謝!

+3

我的猜測是你必須在'listen'之前調用'bind'。 – melpomene

+0

是的,它的工作原理。謝謝 – midCat

+0

'server_addr.sin_addr.s_addr = INADDR_ANY;' – cdarke

回答

0

您應該在bind之後移動listen

bind如果套接字已經綁定,並且未綁定套接字上的listen會自動將其綁定到隨機端口號,則返回錯誤。