套接字C ++:recv函数返回-1

我正在尝试编写与Windows服务器通信的简单android客户端代码。我正在使用套接字来实现这一目标,直到现在,我都在使用Linux机器(android客户端和linux服务器)进行测试。到目前为止,一切正常。现在,我正在尝试在Windows(服务器)上进行设置,我当然注意到我必须稍稍更改代码(如果不只是include ^^')。无论如何,我的问题是我的recv函数返回-1,尽管它应该读取某些内容,但是由于某种原因而没有。

下面是我如何使用我的recv函数(编辑:现在是整个服务器代码):

int tcp_server::start_listening()
{

    WORD wVersionRequested;
    WSADATA wsaData;
    int wsaerr;
    wVersionRequested = MAKEWORD(2, 2);
    wsaerr = WSAStartup(wVersionRequested, &wsaData);
    if (wsaerr != 0)
    {
        printf("Server: The Winsock dll not found!\n");
        WSACleanup();
        return 0;
    }

   else
    {
        printf("Server: The Winsock2 dll found \n");
    }

    sSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

    if(sSock == INVALID_SOCKET)
    {
        printf("Server: Error initializing socket!n");
        WSACleanup();
        return 0;
    }


    sockaddr_in service,client ;
    service.sin_family = AF_INET;
    service.sin_port = htons(port);
    service.sin_addr.s_addr = INADDR_ANY;


   if(bind(sSock,(SOCKADDR*)&service,sizeof(service))==SOCKET_ERROR)
   {
       printf("Server: Error binding socket to portn");
       WSACleanup();
       return 0;
   }

   /* wait for incoming connections */
   if(listen(sSock,10)==SOCKET_ERROR)
       printf("listen(): Error listening on socket %d\n", WSAGetLastError());
   else
   {
      printf("Server: Waiting for connections...\n");
   }

   /* accept connections */
   AcceptSocket;
   printf("Server: Waiting for a client to connect...\n");
   AcceptSocket = accept(sSock, NULL, NULL);
   if (AcceptSocket == INVALID_SOCKET) {
       wprintf(L"accept failed with error: %ld\n", WSAGetLastError());
       closesocket(sSock);
       WSACleanup();
       return 1;
   } else {
       wprintf(L"Client connected.\n");
       acceptConns();
   }

   closesocket(sSock);
   return 0;
}
int tcp_server::acceptConns()
{
    sockaddr_in from;
    bool infinite = true ;
    int fromlen=sizeof(from);
    int readsize;
    char* message;
    char* clientmessage = "\0";
    string smatrix ;
    int ind ;
    string tok;
    int i = 0 ;
    int bytesSent ;

    float matrix[16] ;
    while( (readsize = recv(AcceptSocket, clientmessage, 2000, 0))!= 0 ){
        message = "ack";
        cout << "Writing ACK" << endl ;
        smatrix = clientmessage ;
        std::stringstream ss(smatrix);

        cout << smatrix << endl ;
        while(getline(ss, tok, ',') && i < 16 ){
            matrix[i] = static_cast<float>(::atof(tok.c_str()));
            i++ ;
        }
        i = 0 ;
        Sleep(1000);
    }
    if(readsize == 0 ){
        cerr << "client disconnected" << endl ;
    }
    cout << "Socket closed" << endl ;
    closesocket(sSock);
    WSACleanup();
}

至于我的android代码:这是:

 while(closeConnection == false) {
        if (connected == true && matrixupdated == true && this.hasMatrixChanged()){
            try {
                //= new BufferedReader(new InputStreamReader(java.lang.System.in));
                DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());
                String sentence = this.getStringFromMatrix();
                outToServer.writeBytes(sentence + "\n");
                outToServer.flush();
                inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
                System.arraycopy(matrix, 0, previousMatrix, 0, 16);
                inFromServer.read(serverMsg);
                if(serverMsg.equals("ack") == true){
                    this.serverHasInput = false ;
                    Log.e("ACK", "ACK");
                    inFromServer.read(serverMsg);       //Wait for the "ok" message from server
                    if(serverMsg.equals("ok") == false){
                        Log.e("ERROR IN COM W/ SERV"," DID NOT RECEIVE OK");
                    }
                }
                else{
                    this.serverHasInput = true ;
                }
                //Log.d("SERVERMSG", "DONE WAITING");

            }catch (Exception e) {
                Log.e("ClientActivity", "S: Error", e);
            }
            this.matrixupdated = false ;
        }

    }
    try {
        outToServer.flush();
        outToServer.close();
        inFromServer.close();
        clientSocket.close();
    }

最后,不幸的是我在控制台中得到的输出

客户端断开连接

我猜这可能是一些非常愚蠢的东西,但是我一直试图在MS网站和recv的文档上看到它为什么会给我-1的信息,但我无法获得解释。

预先感谢您提供的帮助:)。

尼古拉·费迪索夫(Nikolai Fetissov)

C ++类代码中有许多错误if (bytesSent = 0),这是将结果强制转换为布尔值的赋值,因此始终返回false您无需关注从TCP套接字读取的字节数,假设您在发送时收到一条完整的消息-这是错误的,因为您可能正在读取部分消息,多于一条消息或两者之间的任何消息-这是一个原始字节流

-1明确检查从系统调用返回的内容,然后检查的值(errno(3)例如说strerror(3)函数)以找出问题所在。

编辑0:

您正在尝试使用侦听套接字sSock进行数据传输-错误-它仅用于接受客户端连接请求。使用时AcceptedSocket,从中退回一个accept()它是与客户端的连接。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

套接字始终返回-1

来自分类Dev

Python TCP套接字recv(1)与recv(n)的效率

来自分类Dev

C套接字编程:recv总是失败

来自分类Dev

C套接字:recv并同时发送

来自分类Dev

TCP套接字函数recv()阻止程序

来自分类Dev

发送失败后关闭套接字不会导致recv函数返回错误状态

来自分类Dev

为什么套接字中的recv()函数不返回任何内容?

来自分类Dev

函数套接字close()方法的返回值“ -1”是否可能?

来自分类Dev

为什么套接字无限返回-1(errno:104)

来自分类Dev

C套接字-send()发送,recv()未接收

来自分类Dev

是否可以使套接字仅对recv()函数无阻塞?

来自分类Dev

recv()函数不读取输入(套接字编程)

来自分类Dev

返回打开的套接字连接/使套接字连接保持打开状态C ++

来自分类Dev

C套接字/轮询错误地返回POLLOUT事件?

来自分类Dev

getpeername()和accept()返回的地址的差异-C套接字

来自分类Dev

C recv函数行为

来自分类Dev

使用 setockopt;当套接字从另一侧关闭时,read 返回 0 而不是 -1

来自分类Dev

如何从 gen_tcp:accept/1 返回的套接字获取 MAC 地址?

来自分类Dev

Linux套接字:如何使send()等待recv()

来自分类Dev

如何使用C处理BSD套接字中的3种方式send()和recv()

来自分类Dev

C 套接字 - recv() 和 recvfrom() - 使用指定的模而不是顺序写入内存?

来自分类Dev

使用C ++进行的Unix套接字编程,recv返回0,但仍在接收数据,但有时接收的内容比发送的要多

来自分类Dev

套接字接收不返回

来自分类Dev

套接字sendto()返回EINVAL

来自分类Dev

套接字返回“[对象对象]”

来自分类Dev

c中的时间函数不断返回-1

来自分类Dev

UDP套接字sendto()函数

来自分类Dev

C#通过1个套接字发送多个不同的对象

来自分类Dev

云函数返回 RequestError:错误:套接字挂断

Related 相关文章

  1. 1

    套接字始终返回-1

  2. 2

    Python TCP套接字recv(1)与recv(n)的效率

  3. 3

    C套接字编程:recv总是失败

  4. 4

    C套接字:recv并同时发送

  5. 5

    TCP套接字函数recv()阻止程序

  6. 6

    发送失败后关闭套接字不会导致recv函数返回错误状态

  7. 7

    为什么套接字中的recv()函数不返回任何内容?

  8. 8

    函数套接字close()方法的返回值“ -1”是否可能?

  9. 9

    为什么套接字无限返回-1(errno:104)

  10. 10

    C套接字-send()发送,recv()未接收

  11. 11

    是否可以使套接字仅对recv()函数无阻塞?

  12. 12

    recv()函数不读取输入(套接字编程)

  13. 13

    返回打开的套接字连接/使套接字连接保持打开状态C ++

  14. 14

    C套接字/轮询错误地返回POLLOUT事件?

  15. 15

    getpeername()和accept()返回的地址的差异-C套接字

  16. 16

    C recv函数行为

  17. 17

    使用 setockopt;当套接字从另一侧关闭时,read 返回 0 而不是 -1

  18. 18

    如何从 gen_tcp:accept/1 返回的套接字获取 MAC 地址?

  19. 19

    Linux套接字:如何使send()等待recv()

  20. 20

    如何使用C处理BSD套接字中的3种方式send()和recv()

  21. 21

    C 套接字 - recv() 和 recvfrom() - 使用指定的模而不是顺序写入内存?

  22. 22

    使用C ++进行的Unix套接字编程,recv返回0,但仍在接收数据,但有时接收的内容比发送的要多

  23. 23

    套接字接收不返回

  24. 24

    套接字sendto()返回EINVAL

  25. 25

    套接字返回“[对象对象]”

  26. 26

    c中的时间函数不断返回-1

  27. 27

    UDP套接字sendto()函数

  28. 28

    C#通过1个套接字发送多个不同的对象

  29. 29

    云函数返回 RequestError:错误:套接字挂断

热门标签

归档