简体   繁体   English

send() 调用仅适用于套接字中的 te.net

[英]send() call only works for telnet in socket

I am using windows sockets with c++. In the following call I am trying to reply a message to the socket that just connected.我正在使用 windows sockets 和 c++。在下面的调用中,我试图向刚刚连接的套接字回复一条消息。

I tried connecting using a dummy client in c++. It would connect but the recv() would not receive anything.我尝试在 c++ 中使用虚拟客户端进行连接。它会连接但 recv() 不会收到任何东西。

Then I tried using te.net, it worked instantly, just as i wanted.然后我尝试使用 te.net,它立即起作用,正如我想要的那样。

SOCKET s = accept(ls, (sockaddr*)&clientSin, &s_len);

            if (s == INVALID_SOCKET) {
                cerr << "Error in accept call: " << WSAGetLastError();
            }
            else {
                cout << "Connection accepted at , socket no. :" << s << endl;
                //adding to list of incoming sockets
                inactiveList.push_back(s);
                //send message to client requesting credentials
                char buff[10];
                
                // the character 'x' is a code to the client to provide the server with the credentials
                buff[0] = 'x';
                buff[1] = '\0';
                //send(s, buff, 2, 0);
                if (send(s, "From Vic: ", 10, 0) == INVALID_SOCKET)
                {
                    int errorcode = WSAGetLastError();
                    cerr << "send to client failed: " << errorcode << endl;
                    closesocket(s);
                    continue;
                }
                Sleep(1000);
                if (send(s, "From Vic: ", 10, 0) == INVALID_SOCKET)
                {
                    int errorcode = WSAGetLastError();
                    cerr << "send to client failed: " << errorcode << endl;
                    closesocket(s);
                    continue;
                }
                
            }

the recv code is:接收代码是:

tnb = 0;
    while ((nb = recv(s, &buff[tnb], LINESZ - tnb, 0)) > 0)
    {
        tnb += nb;
    }
    /* If there was an error on the read, report it. */
    if (nb < 0)
    {
        printf("recv failed: %d\n", WSAGetLastError());
        return 1;
    }
    if (tnb == 0)
    {
        printf("Disconnect on recv");
    }
    /* Make the response NULL terminated and display it.  Using C output */
    printf("tnb = %d\n", tnb);
    buff[tnb] = '\0';
    puts(buff);

Taking all my comments and turning it into an answer.接受我所有的评论并将其转化为答案。

I suspect your recv loop is continuing forever because you haven't sent enough data to make it break out of the loop.我怀疑你的 recv 循环会永远持续下去,因为你没有发送足够的数据来让它跳出循环。

Change this:改变这个:

while ((nb = recv(s, &buff[tnb], LINESZ - tnb, 0)) > 0)
{
    tnb += nb;
}

To this: (notice that I'm allocating +1 for the array buff)为此:(请注意我正在为数组 buff 分配 +1)

char buff[LINESZ+1]; // +1 for null terminator
buff[0] = '\0';
tnb = 0;
while (tnb < LINESZ)
{
    nb = recv(s, &buff[tnb], LINESZ-tnb, 0);
    if (nb < 0)
    {
        printf("Error on socket: %d\n", (int)WSAGetLastError());
        break;
    }
    else if (nb == 0)
    {
        printf("Remote socket closed\n");
        break;
    }

    printf("Received: %d bytes\n", (int)nb);

    tnb += nb;
    buff[tnb] = '\0'; // null terminate the end of the buffer so it will print reliably
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM