【问题标题】:Client fails to connect客户端无法连接
【发布时间】:2011-09-19 20:28:29
【问题描述】:

我是一名新手/初学者程序员,在让一些简单的客户端/服务器 C 代码正常工作时遇到问题。我的最终目标是将方位角/仰角数据的“流”从服务器发送到客户端,然后在接收到该数据时对其进行转换(这只是一个部门,但我真的不知道该怎么做或者)转换成平移/倾斜单元的位置数据,然后通过串行将转换后的数据输出到平移/倾斜云台。 (我可能稍后会回来问这个问题......)

现在我只是想弄清楚如何发送和接收数据。我从这个网站上抓取了代码。 http://www.tenouk.com/Winsock/Winsock2example3.html。我不得不移动一些声明来编译代码。

我在客户端电脑上使用的是 Windows 7 和 VS2010 专业版。客户端和服务器之间没有路由器(它们通过以太网直接连接)。

使用调试器,我发现此时我被挂断了。

clientService.sin_family = AF_INET;
clientService.sin_addr.s_addr = inet_addr("12.266.66.255");
clientService.sin_port = htons(55555);

if (connect(m_socket, (SOCKADDR*)&clientService, sizeof(clientService)) == SOCKET_ERROR)
{
    printf("Client: connect() - Failed to connect.\n");
    WSACleanup();
    return 0;
}

else
{
   printf("Client: connect() is OK.\n");
   printf("Client: Can start sending and receiving data...\n");
}

我总是收到“连接失败”的消息,我不知道为什么。我使用的是正确的主机IP地址(我在放这里之前更改了它)。

如果这是一个不好的例子,我愿意用另一个例子重新开始。我已经尝试了几个在线常见的“回声”示例,并且遇到了类似的问题。如果有帮助,我也可以提供有关我的整体计划目标的更多信息。其余的客户端代码如下。我正在使用来自同一个链接的服务器代码(声明移动了)。谢谢。

int main()
{

int m_socket;

struct sockaddr_in clientService;

int bytesSent;

int bytesRecv = SOCKET_ERROR;
// Be careful with the array bound, provide some checking mechanism...
char sendbuf[200] = "This is a test string from client";
char recvbuf[200] = "";
// Initialize Winsock.

WSADATA wsaData;

int iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
if (iResult != NO_ERROR)
          printf("Client: Error at WSAStartup().\n");
else
          printf("Client: WSAStartup() is OK.\n");

// Create a socket
m_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (m_socket == INVALID_SOCKET)
{
    printf("Client: socket() - Error at socket(): %ld\n", WSAGetLastError());
    WSACleanup();
    return 0;
}

else
   printf("Client: socket() is OK.\n");

// Connect to a server.
// Just test using the localhost, you can try other IP address
clientService.sin_family = AF_INET;
clientService.sin_addr.s_addr = inet_addr("12.233.21.254");
clientService.sin_port = htons(55555);

if (connect(m_socket, (SOCKADDR*)&clientService, sizeof(clientService)) == SOCKET_ERROR)
{
    printf("Client: connect() - Failed to connect.\n");
    WSACleanup();
    return 0;
}

else
{
   printf("Client: connect() is OK.\n");
   printf("Client: Can start sending and receiving data...\n");
}

// Send and receive data.
   // Receives some test string to server...

   while(bytesRecv == SOCKET_ERROR)
   {
       bytesRecv = recv(m_socket, recvbuf, 200, 0);

    if (bytesRecv == 0 || bytesRecv == WSAECONNRESET)
    {
         printf("Client: Connection Closed.\n");
        break;
    }

    if (bytesRecv < 0)
        return 0;

   else
   {
          printf("Client: recv() is OK.\n");
          printf("Client: Received data is: \"%s\"\n", recvbuf);
          printf("Client: Bytes received is: %ld.\n", bytesRecv);

   }

}

   // Sends some test data to server...
   bytesSent = send(m_socket, sendbuf, strlen(sendbuf), 0);

   if(bytesSent == SOCKET_ERROR)
          printf("Client: send() error %ld.\n", WSAGetLastError());

   else
   {
          printf("Client: send() is OK - Bytes sent: %ld\n", bytesSent);
          printf("Client: The test string sent: \"%s\"\n", sendbuf);
   }

WSACleanup();

return 0;

}

【问题讨论】:

  • inet_addr("12.266.66.255")表示266是错误的,最后255也可能是错误的(通常是广播地址):P
  • 您是否尝试过 telnet 到服务器的 IP/端口,看看您的计算机是否可以真正连接到它?
  • 希望266不在原来的地址
  • connect() 挂起了吗?可能的防火墙问题?
  • @hexa 我在发布之前随机更改了数字。 @Ates Goral 我现在就试试。谢谢。

标签: c windows sockets client-server


【解决方案1】:

您的原始代码(显然是在我更改了 IP 和端口之后)连接到我的网络服务器很好,但我确实对其进行了一些调整(如下)。

虽然可能有点多,但CSocketServer 包含大量经过验证的优秀 WinSock 代码。

无论如何,这段代码连接到我的本地网络服务器,发送了一个基​​本请求并收到了响应。

int WSATest()
{
    // Initialize Winsock.
    WSADATA wsaData;
    if (WSAStartup(MAKEWORD(2,2), &wsaData) != NO_ERROR)
    {
        printf("Client: Error at WSAStartup().\n");
        return 0;
    }

    // Create a socket
    SOCKET m_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (m_socket == INVALID_SOCKET)
    {
        printf("Client: socket() - Error at socket(): %ld\n", WSAGetLastError());
        WSACleanup();
        return 0;
    }
    else {
        printf("Client: socket() is OK.\n");
    }

    struct sockaddr_in clientService;
    clientService.sin_family = AF_INET;
    clientService.sin_addr.s_addr = inet_addr("127.0.0.1");
    clientService.sin_port = htons(9990);

    //Connect to the remote peer:
    if (connect(m_socket, (SOCKADDR*)&clientService, sizeof(clientService)) == SOCKET_ERROR)
    {
        printf("Client: connect() - Failed to connect.\n");
        WSACleanup();
        return 0;
    }
    else
    {
        printf("Client: connect() is OK.\n");
        printf("Client: Can start sending and receiving data...\n");
    }

    //Very, very basic HTTP request.
    int iSendResult = send(m_socket, "GET / \n\n", 8, 0);
    if(iSendResult == SOCKET_ERROR)
    {
        printf("Failed to send data, error %d.\n", WSAGetLastError());
        return 0;
    }

    while(true)
    {
        char sRecvBuffer[200];
        int iRecvResult = recv(m_socket, sRecvBuffer, sizeof(sRecvBuffer) - 1, 0);

        if(iRecvResult <= SOCKET_ERROR)
        {
            printf("Failed to receive data, error %d.\n", WSAGetLastError());
            break;
        }
        else if(iRecvResult == 0)
        {
            //Graceful disconnect.
            break;
        }
        else {
            //Be sure to terminate the buffer.
            sRecvBuffer[iRecvResult] = '\0';
        }

        printf("Received: [%s] for [%d] bytes.\n", sRecvBuffer, iRecvResult);
    }

    WSACleanup();

    return 0;
}

int main()
{
    WSATest();
    system("Pause");
}

【讨论】:

  • 如果您需要进一步的帮助,请发表评论。我很乐意提供额外的资源。我已经做了很多了!例如:networkdls.com/Software.Asp?Review=84
  • 谢谢!今天晚些时候你可能会收到我的来信。我先看看是不是防火墙有问题什么的。
  • @NTDLS 正如我在原始帖子中所说,一旦我完成这项工作,我想将数据从服务器流式传输到客户端,然后对传入的数据执行一些划分(即时),然后立即通过串行输出(我有一个制造商为这部分定制的 API)。我如何着手修改和发送收到的这些数据? sn-p 或示例会很好,我只是对语法感到困惑。谢谢。
  • @Mike:有几种方法可以解决。首先,您可以使用 FD_SET 和 select() 函数来确定“可读性”(准备好调用 recv())或“可写性”(准备好调用 send())。或者,您可以将套接字设置为非阻塞并使用 recv() 轮询数据。您是否计划一次处理多个连接?
  • 哦,你所说的“执行一些部门”是什么意思。你让我很好奇。
【解决方案2】:

为什么不添加WSAGetLastError() 来检查实际错误?

【讨论】:

  • @hexa 他已经说过他在发帖前混淆了地址
  • @Ates Goral 在使用 GetLastError 时,我得到一个“网络无法访问”。尝试连接到我的服务器时出现错误 (10051)。我关闭了两台计算机上的防火墙,只使用了一条连接 NIC 的以太网电缆。
  • 您需要使网络可访问(:. 由您来保证他们可以看到彼此(他们在同一个子网中吗?他们是否试图通过网关?ping 是否给您同样的错误?)我只需将两台机器都插入备用路由器,然后通过 MAC 地址保留静态 IP。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-27
  • 2013-06-06
  • 1970-01-01
  • 2022-10-20
  • 2020-10-08
  • 2016-12-08
  • 2015-08-19
相关资源
最近更新 更多