2012-07-26 54 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);