【问题标题】:C# client to C++ server Tcp socket connection errorC# 客户端到 C++ 服务器 Tcp 套接字连接错误
【发布时间】:2017-11-08 03:41:30
【问题描述】:

客户端是跨平台应用程序(android & ios) (C#) 服务器是 Windows。(C++)

我成功连接到服务器但是这个服务器recv函数返回0后严重。但是当我尝试用 c++ 客户端连接服务器时,我没有遇到这个问题。

当客户端关闭时,Recv 函数返回 0,所以我不想做“继续;”如果 recv 返回 0。

我将此客户端代码添加到 Button。单击按钮后,套接字是否关闭?

客户端 C# 代码:

private static async void ConnectAsTcpClient()
    {

            using (var tcpClient = new TcpClient())
            {
                //Console.WriteLine("[Client] Connecting to server");
                await tcpClient.ConnectAsync("127.0.0.1", 12312);
                Console.WriteLine("[Client] Connected to server");
            }

    }

服务器 C++ 代码: 袜子;

// for our thread
DWORD thread;

WSADATA wsaData;
sockaddr_in server;

// start winsock
int ret = WSAStartup(0x101, &wsaData); // use highest version of winsock avalible

if (ret != 0)
{
    return 0;
}

// fill in winsock struct ... 
server.sin_family = AF_INET;
server.sin_addr.s_addr = INADDR_ANY;
server.sin_port = htons(12312); // listen on telnet port 23

                              // create our socket
sock = socket(AF_INET, SOCK_STREAM, 0);

if (sock == INVALID_SOCKET)
{
    return 0;
}

// bind our socket to a port(port 123) 
if (bind(sock, (sockaddr*)&server, sizeof(server)) != 0)
{
    return 0;
}

// listen for a connection  
if (listen(sock, 5) != 0)
{
    return 0;
}

// socket that we snedzrecv data on
SOCKET client;

sockaddr_in from;
int fromlen = sizeof(from);
printf("Server Started\n");
client = accept(sock, (struct sockaddr*)&from, &fromlen);
printf("Client connected\r\n");

while (true)
{
    res = recv(current_client, buf, sizeof(buf), 0); // recv cmds


    // multi Thread
    Sleep(30);

    if (res == 0 || res >= 150)
    {
        printf("Recv Failed! = %d\n", res);
        continue;
    }

【问题讨论】:

    标签: c# c++ sockets server client


    【解决方案1】:

    客户端不写任何东西,而是让tcpClient对象超出范围,从而断开连接,导致recv在服务器中返回0

    顺便说一句,您忘记检查recv 调用中的实际错误(当res == SOCKET_ERROR 时)。

    【讨论】:

    • 我认为问题出在客户端,因为当我关闭 Android 服务器上的应用程序时,一直收到 0。所以在连接客户端套接字断开连接后,IDK 如何修复它。
    • @ismetJM 如果recv返回0,则说明另一端已关闭连接。然后,您必须关闭连接的一端,然后返回等待新的连接。 recv 返回 0 的行为已很好地记录在案,任何好的网络教程都应该告诉你这意味着什么以及该怎么做。
    最近更新 更多