winsock2 - 连接“迷茫”

时间:2013-12-22 21:39:20

标签: c++ winsock2

我正试图通过循环获取并发送一些信息。

这是一个基本代码:

#include "network/server.h"

// ################################################
// ##
// ##   Configuration de la socket
// ##   Connexion
// ##   Destruction
// ##
// ################################################

server::server()
{
    framework = new handler();

    #if defined (WIN32)
            erreur = WSAStartup(MAKEWORD(2,2), &WSAData);
    #else
            erreur = 0;
    #endif

    if(!erreur)
    {
        // Creation de la socket
        sock = socket(AF_INET, SOCK_STREAM, 0);

        // Configuration de la connexion ( ip, protocol tcp, port )
        sin.sin_addr.s_addr = inet_addr("127.0.0.1");
        sin.sin_family = AF_INET;
        sin.sin_port = htons(4545);
        // Connection
        if(connect(sock, (SOCKADDR*)&sin, sizeof(sin)) != SOCKET_ERROR)
        {
            // Thread => lance le listener
            thread = new pthread_t();
            pthread_create(thread, NULL, StaticThreadFunc, this);
            pthread_join(*thread, NULL);
        }
    }
}


server::~server()
{
        closesocket(sock);

        #if defined (WIN32)
                WSACleanup();
        #endif

}

// ################################################
// ##
// ##   Loop
// ##   Processus de réponse : handler
// ##
// ##
// ################################################

void *server::StaticThreadFunc(void *Param)
{
    server* Obj = reinterpret_cast<server*>(Param);
    return Obj->listener();
}
void* server::listener()
{
    while(1)
    {
        ok = recv(sock, buffer, sizeof(buffer), 0);
        if(ok == 0||ok == WSAECONNRESET||ok == WSAECONNABORTED)
        {
            cout << "connection closed at otherEnd" << endl;
        }
        binaryReader *_loc1_ = new binaryReader(buffer);

        Id = _loc1_->readShort();
        response = framework->process(Id, buffer);
        if(response.buffer != NULL)
        {
            ok = send(sock, response.buffer, response.size, 0);
            if(ok == SOCKET_ERROR)
                cout << "failed sending data" << endl;
        }
        delete _loc1_;
    }
}

回复:

 struct handlerResponse
 {
     char *buffer;
     int size;
 };

代码工作正常一段时间,然后连接只是没有任何理由关闭。 它确实接收了大约3条消息,发送1,然后再次接收1,然后它才关闭。

如果你能帮助我,那就太好了!

我应该设置超时吗? (这是什么)

感谢

1 个答案:

答案 0 :(得分:1)

这似乎是recv / send函数的常见场景。请记住,您正在使用协议(TCP),即使符号常量也表明SOCK_STREAM的行为类似于std文件流,最重要的是recv / send返回放入内部缓冲区的数量!如果您阅读recv,它表示此函数不会立即返回len参数,它可能返回错误或其他一些内容而有时小于len但是它仍然成功!

所以一般要求一个固定的大小并希望它会像大胆一样发生,你应该期望recv(和send)函数充当一个流,这样它们就可以返回你要求的精确数据量或更少,这种情况可能会发生在本地主机上,但这种情况在真实网络中更频繁发生。

一种解决方法是recv 直到你得到错误你得到了你想要的数据,然后再继续。

我前段时间对同一主题给出了答案:some content of function 'send' is missing