为什么不能连接到localhost的简单套接字?

时间:2011-11-26 09:30:32

标签: c++ winapi winsock winsock2

我正在学习如何使用win32套接字(winsock2)的教程。我正在尝试创建一个连接到“localhost”的简单套接字,但是当我尝试连接到本地主机(在函数connect())时,我的程序失败。

我是否需要管理员权限才能连接到localhost?也许这就是它失败的原因?也许我的代码存在问题?我试过了端口8888& 8000&他们都失败了。

此外,如果我将端口更改为80&连接到www.google.com我可以连接但是我没有回复。是因为我没有发送HTTP请求,还是我想回复一些回复?

这是我的代码(删除了包含):

// Constants & Globals //
typedef unsigned long IPNumber;    // IP number typedef for IPv4
const int SOCK_VER    = 2;
const int SERVER_PORT = 8888;  // 8888
SOCKET mSocket        = INVALID_SOCKET;
SOCKADDR_IN sockAddr  = {0};
WSADATA wsaData;
HOSTENT* hostent;


int _tmain(int argc, _TCHAR* argv[])
{
    // Initialise winsock version 2.2
    if (WSAStartup(MAKEWORD(SOCK_VER,2), &wsaData) != 0)
    {
        printf("Failed to initialise winsock\n");
        WSACleanup();
        system("PAUSE");
        return 0;
    }

    if (LOBYTE(wsaData.wVersion) != SOCK_VER || HIBYTE(wsaData.wVersion) != 2)
    {
        printf("Failed to load the correct winsock version\n");
        WSACleanup();
        system("PAUSE");
        return 0;
    }

    // Create socket
    mSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (mSocket == INVALID_SOCKET)
    {
        printf("Failed to create TCP socket\n");
        WSACleanup();
        system("PAUSE");
        return 0;
    }


    // Get IP Address of website by the domain name, we do this by contacting(??) the Domain Name Server
    if ((hostent = gethostbyname("localhost")) == NULL)  // "localhost"  www.google.com
    {
        printf("Failed to resolve website name to an ip address\n");
        WSACleanup();
        system("PAUSE");
        return 0;
    }

    sockAddr.sin_port             = htons(SERVER_PORT);
    sockAddr.sin_family           = AF_INET;
    sockAddr.sin_addr.S_un.S_addr = (*reinterpret_cast <IPNumber*> (hostent->h_addr_list[0]));
    // sockAddr.sin_addr.s_addr=*((unsigned long*)hostent->h_addr);  // Can also do this

    // ERROR OCCURS ON NEXT LINE: Connect to server
    if (connect(mSocket, (SOCKADDR*)(&sockAddr), sizeof(sockAddr)) != 0)
    {
        printf("Failed to connect to server\n");
        WSACleanup();
        system("PAUSE");
        return 0;
    }

    printf("Got to here\r\n");
    // Display message from server
    char buffer[1000];
    memset(buffer,0,999);
    int inDataLength=recv(mSocket,buffer,1000,0);
    printf("Response: %s\r\n", buffer);

    // Shutdown our socket
    shutdown(mSocket, SD_SEND);

    // Close our socket entirely
    closesocket(mSocket);

    // Cleanup Winsock
    WSACleanup();

    system("pause");
    return 0;
}

3 个答案:

答案 0 :(得分:3)

由于您愿意使用connection based的TCP协议,您需要一个通信对应方,例如监听端口8888的应用程序来响应您的连接启动请求( SYN - TCP术语中的分组)

你可以使用unix工具netcat(也可以用于其他操作系统),而无需管理员权限......

nc -l 8888

...在本地计算机上的端口8888上打开一个侦听套接字

但是,在unix系统上,您不能在没有管理员权限的情况下收听所谓的well known ports

有关TCP Connection Life-Cycle

的更多信息,请参阅

答案 1 :(得分:0)

有人应该在你正在连接的端口进行监听。尝试编写一个侦听传入连接的小型服务器程序。如果连接成功显然你连接到谷歌但你需要发送一个HTTP请求(从C? - 这将是困难的。)

答案 2 :(得分:0)

要连接到localhost上的TCP端口,必须有人在您的计算机上侦听该端口。

除了编写自己的服务器之外,还有一种简单的方法可以监听某些程序:在您的计算机上安装“简单TCP / IP服务”功能。这将为您提供端口17上的“当日报价”服务器,端口13上的日间服务器,端口19上的Chargen服务器和端口7上的回显服务器。

要安装它,请转到“程序和功能”或“添加/删除程序”或Windows上调用的任何内容,选择“打开或关闭Windows功能”并查找并安装“简单TCPIP服务” “在列表中。