我正试图通过循环获取并发送一些信息。
这是一个基本代码:
#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,然后它才关闭。
如果你能帮助我,那就太好了!
我应该设置超时吗? (这是什么)
感谢
答案 0 :(得分:1)
这似乎是recv / send函数的常见场景。请记住,您正在使用协议(TCP),即使符号常量也表明SOCK_STREAM的行为类似于std文件流,最重要的是recv / send返回放入内部缓冲区的数量!如果您阅读recv,它表示此函数不会立即返回len参数,它可能返回错误或其他一些内容而有时小于len但是它仍然成功!
所以一般要求一个固定的大小并希望它会像大胆一样发生,你应该期望recv(和send)函数充当一个流,这样它们就可以返回你要求的精确数据量或更少,这种情况可能会发生在本地主机上,但这种情况在真实网络中更频繁发生。
一种解决方法是recv 直到你得到错误或你得到了你想要的数据,然后再继续。
我前段时间对同一主题给出了答案:some content of function 'send' is missing