2012-07-26 113 views
0

我正在嘗試將我的TCP客戶端配置爲使用特定的本地端口連接到另一個TCP服務器。將客戶端綁定到本地端口

我使用下面的代碼,但它不工作。 你知道我做錯了什麼,如果這是可能的? 我正在使用LINUX機器。

感謝

AFG

int localport=32000; 
    m_clientfd = socket(AF_INET, SOCK_STREAM, 0); 
    assert(m_clientfd >= 0); 

    // someone set the localport   
    struct sockaddr_in sa_loc; 
    struct hostent* pLocalHostInfo = gethostbyname("localhost"); 
    long LocalHostAddress; 
    memcpy(&LocalHostAddress, pLocalHostInfo->h_addr 
    , pLocalHostInfo->h_length); 

    // Local 
    memset(&sa_loc, 0, sizeof(struct sockaddr_in)); 
    sa_loc.sin_family = AF_INET; 
    sa_loc.sin_port = htons(localport); 
    sa_loc.sin_addr.s_addr = LocalHostAddress; 
    int ret_bind = bind(m_clientfd, (struct sockaddr *)&sa_loc 
    , sizeof(struct sockaddr)); 
    assert(ret_bind != -1); 
+1

你所擺在首位做錯了是,你仍然使用'的gethostbyname()',而不是['的getaddrinfo()'](http://pubs.opengroup.org/onlinepubs/009604499/functions /getaddrinfo.html)。這並不是說它不能用'gethostbyname()',但它完全是遺留的。世界不再僅僅由IPv4組成。 – glglgl 2012-07-26 10:59:28

回答

3
int ret_bind = bind(m_clientfd, (struct sockaddr *)&sa_loc, 
    sizeof(struct sockaddr)); 

最後一個參數應該是sizeof(sa_loc)sizeof(struct sockaddr_in)

0

它看起來使用下面的代碼使應用程序工作。這足以取消本地IP的設置。

// Local 
memset(&sa_loc, 0, sizeof(struct sockaddr_in)); 
sa_loc.sin_family = AF_INET; 
sa_loc.sin_port = htons(localport); 
// sa_loc.sin_addr.s_addr = LocalHostAddress; // COMMENT THIS TO WORK 
int ret_bind = bind(m_clientfd, (struct sockaddr *)&sa_loc 
, sizeof(struct sockaddr)); 
assert(ret_bind != -1);