函数connect()返回零,无论它是否成功连接

时间:2011-01-23 01:45:32

标签: c++ tcp

当我在i7计算机上使用connect()功能时,无论是否成功连接,它总是返回零。我只是没有另一个连接的应用程序,它无论如何都返回零(服务器的地址127.0.0.1)。

当我在不同的计算机上运行相同的应用程序时,它的行为正确。那么,有什么问题呢?

谢谢。

编辑从下面的答案移动。

代码

struct hostent* pHostEntry;

pHostEntry = gethostbyname(host);

if(pHostEntry == NULL)
{
    return 0;
}

struct in_addr* host_addr = (struct in_addr*) * pHostEntry->h_addr_list;

if(host_addr == NULL)
{
    return 0;
}

long sockfd;

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

memset((char*) &serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr  = *host_addr;
serv_addr.sin_port   = htons(port);

if(connect(sockfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) == SOCKET_ERROR)
{
    CloseSocket();
    sockfd = -1;
    return 0;
}

在这里。在这里,我总是零。我当然检查了是否有任何其他应用程序监听相同的端口。那里没人。而且,如果我有一个,那么如果我的服务器开启,我就无法工作。但是当我的服务器开启时,我没有任何冲突。 i7 - &gt;英特尔(R(Core(TM)i7 CPU 930 @ 2,80GHz 2.80 GHz我现在使用此代码一段时间。我有几台具有不同操作系统和芯片的计算机。只有这个(使用OS Windows 7)有这样的问题。我只是想知道是否有人遇到同样的问题。谢谢

2 个答案:

答案 0 :(得分:0)

Windows 7完全有可能返回远程服务器的IP6地址。我建议你查看pHostEntry->h_addrtype

的值

答案 1 :(得分:0)

这一行错了:

if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)

在Unix上,这是有效的,因为有效的文件描述符往往是小的非负数。但根据the documentation for socket-1是唯一的错误返回代码。其他负数不是错误。

现在,您正试图在Windows上运行此代码,并假设描述符是小的非负数字。

Windows文档非常清晰。 socket returns INVALID_SOCKET in case of error, all other values indicate success.