c++ 编程问题-高人来帮助下小弟,纠结到吐血的问题

问题描述

高人来帮助下小弟,纠结到吐血的问题

先上下vs2010报错代码

1> 正在创建库 D:QtprojectsrcServerDebugServer.lib 和对象 D:QtprojectsrcServerDebugServer.exp
1>net_comm.obj : error LNK2019: 无法解析的外部符号 "public: void __thiscall tcp_session::write(class tcp_message *)" (?write@tcp_session@@QAEXPAVtcp_message@@@Z),该符号在函数 "private: bool __thiscall net_comm::send_msg(class tcp_message * &)" (?send_msg@net_comm@@AAE_NAAPAVtcp_message@@@Z) 中被引用
1>net_comm.obj : error LNK2019: 无法解析的外部符号 "public: void __thiscall tcp_session::close(void)" (?close@tcp_session@@QAEXXZ),该符号在函数 "protected: bool __thiscall net_comm::send_packet(class boost::shared_ptr &,class serial_packet &)" (?send_packet@net_comm@@IAE_NAAV?$shared_ptr@Vtcp_session@@@boost@@AAVserial_packet@@@Z) 中被引用
1>net_comm.obj : error LNK2019: 无法解析的外部符号 "public: bool __thiscall tcp_session::isconnected(void)" (?isconnected@tcp_session@@QAE_NXZ),该符号在函数 "protected: bool __thiscall net_comm::send_packet(class boost::shared_ptr &,class serial_packet &)" (?send_packet@net_comm@@IAE_NAAV?$shared_ptr@Vtcp_session@@@boost@@AAVserial_packet@@@Z) 中被引用
1>net_comm.obj : error LNK2019: 无法解析的外部符号 "public: class boost::asio::basic_stream_socket > & __thiscall tcp_session::socket(void)" (?socket@tcp_session@@QAEAAV?$basic_stream_socket@Vtcp@ip@asio@boost@@V?$stream_socket_service@Vtcp@ip@asio@boost@@@34@@asio@boost@@XZ),该符号在函数 "protected: bool __thiscall net_comm::send_packet(class boost::shared_ptr &,class serial_packet &)" (?send_packet@net_comm@@IAE_NAAV?$shared_ptr@Vtcp_session@@@boost@@AAVserial_packet@@@Z) 中被引用
1>ServerNetwork.obj : error LNK2019: 无法解析的外部符号 "public: __thiscall tcp_server::tcp_server(unsigned short,class net_comm *,int)" (??0tcp_server@@QAE@GPAVnet_comm@@H@Z),该符号在函数 "class boost::shared_ptr __cdecl boost::make_shared(int &,class ServerNetwork * const &&,int &)" (??$make_shared@Vtcp_server@@AAHQAVServerNetwork@@AAH@boost@@YA?AV?$shared_ptr@Vtcp_server@@@0@AAH$$QBQAVServerNetwork@@0@Z) 中被引用
1>D:QtprojectsrcServerDebugServer.exe : fatal error LNK1120: 5 个无法解析的外部命令
========== 全部重新生成: 成功 0 个,失败 1 个,跳过 0 个 ==========

这个错误write() close() isconnected() 我函数里都是有明确定义 为什么还是报这个错 生成的时候报的错?

解决方案

这个相关的文件代码 net_comm.cpp

#include "net_comm.hpp"
#include
#pragma warning(disable:4355)
#pragma warning(disable:4996)
#pragma comment(lib,"ws2_32.lib")
#pragma comment( lib, "vfw32.lib" )
net_comm::net_comm(int sec_check):
m_req_worker(m_recvq), m_resp_worker(m_sendq)
{
m_req_worker.set_workerFunc(boost::bind(&net_comm::process_msg, this, _1));
m_resp_worker.set_workerFunc(boost::bind(&net_comm::send_msg, this, _1));

//每隔sec_check秒向会话端发送一次检测包
m_schedule.add(boost::bind(&net_comm::check_session_status, this), sec_check);

//开始
m_schedule.start();

}
//启动工作线程
void net_comm::start()
{
m_req_worker.start();
m_resp_worker.start();
}
net_comm::req_queue_type &net_comm::recv_queue()
{
return m_recvq;
}
//以下两个函数是供调用的回调函数
bool net_comm::process_msg(tcp_request_ptr &req)
{
msg_head *head = req->get_head();
serial_packet *p = m_packetfactory.generate_packet(static_cast(head->type), req->msg_data(), head->size);
if (p)
{
return proc_packet(req->get_session(), p);
}
return false;

}

    **bool net_comm::send_msg(tcp_response_ptr &resp)
    {
        resp->set_msg_crc();
        resp->get_session()->write(resp);
        return true;
    }**

bool net_comm::session_connected(tcp_session_ptr &session)
{
proc_connect(session);
return add_session(session);
}
bool net_comm::session_disconnected(tcp_session_ptr &session)
{
proc_disconnect(session);
return remove_session(session);
}
bool net_comm::send_packet(tcp_session_ptr &sp, serial_packet &packet)
{
//每一次发包之前先检测该连接的状态
if (!sp->socket().is_open() || !sp->isconnected())
{
sp->close();
return false;
}
tcp_response_ptr resp = boost::factory()(sp);
generate_session_data(resp, packet);
m_sendq.push(resp);
return true;
}
void net_comm::generate_session_data(tcp_response_ptr &resp, serial_packet &packet)
{
//1.构建输出流,将packet中的数据序列化至buf
char buf[SEND_BUFFER];
memset(buf, 0, SEND_BUFFER);
stream sa(buf);
text_oarchive oa(sa);
packet.serial(oa);

//2.构建消息头
msg_head head;
head.type = packet.get_packet_type();
std::string strbuf(buf);

head.size = static_cast<uint32_t>(strbuf.size());
head.chksum = std::for_each(strbuf.begin(), strbuf.end(), crc_32_type())();

//3.赋值
resp->get_head()->chksum = head.chksum;
resp->get_head()->size = head.size;
resp->get_head()->type = head.type;

std::copy(strbuf.begin(),
    strbuf.begin() + strbuf.size(),
    resp->msg_data().begin());

}
bool net_comm::add_session(const tcp_session_ptr &session)
{
//如果该会话端没有在列表中才加入
if (!m_tcp_sessions.find(session))
{
m_tcp_sessions.push_back(session);
return true;
}
return false;
}
bool net_comm::remove_session(const tcp_session_ptr &session)
{
return m_tcp_sessions.remove(session);
}
void net_comm::check_session_status()
{

}

解决方案二:

我用的是BOOST库 这个是实现wtire函数的文件

#include "tcp_session.hpp"
#include
#include
#include
using namespace std;
#include
#pragma once
using namespace boost;
using namespace boost::asio;

tcp_session::object_pool_type tcp_session::m_msg_pool;

tcp_session::tcp_session(ios_type &ios, queue_type &q):
m_socket(ios), m_strand(ios), m_queue(q), m_bconnected(false)
{
}

tcp_session::socket_type &tcp_session::socket()
{
return m_socket;
}
tcp_session::ios_type &tcp_session::io_service()
{
return m_socket.get_io_service();
}

void tcp_session::start()
{
//说明该会话已连接
setconnected(true);

//表示有一个会话端连接
if (m_connect_func)
{
    m_connect_func(shared_from_this());
}

read_data();

}

void tcp_session::close()
{
//当当前连接状态变为断开状态时调用断开连接的回调函数
if (isconnected())
{
if (m_disconnect_func)
{
m_disconnect_func(shared_from_this());
}
}
setconnected(false);
m_socket.close();
}

void tcp_session::set_callbackfunc(function_type &connfunc, function_type &disconnfunc)
{
m_connect_func = connfunc;
m_disconnect_func = disconnfunc;
}
void tcp_session::read_data()
{
//step3-->创建消息对象
tcp_request_ptr req = create_request();

//启动异步读取
read(req);

}

//使用内存池创建tcp_message对象
tcp_request_ptr tcp_session::create_request()
{
//此处将tcp_session与tcp_message绑定在一起
return m_msg_pool.construct(shared_from_this());
}

void tcp_session::setconnected(bool bFlag)
{
m_bconnected.setValue(bFlag);
}
//关闭TCP连接
//启动异步读
void tcp_session::read(tcp_request_ptr req)
{
//step4-->异步读取消息头
boost::asio::async_read(m_socket,
boost::asio::buffer(req->head_data().data(),
req->head_data().size()),
m_strand.wrap(
boost::bind(&tcp_session::handle_read_head, shared_from_this(),
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred,
req)));
}

//异步读取消息头
void tcp_session::handle_read_head(const boost::system::error_code &error,
size_t bytes_transferred,
tcp_request_ptr req)
{
//检查消息头是否正确,消息头正确,再读取消息体
if (error || !req->check_head())
{
close();
return;
}

//step5-->异步读取消息体
boost::asio::async_read(m_socket,
           boost::asio::buffer(req->msg_data().data(), req->get_head()->size),
           m_strand.wrap(
                          boost::bind(&tcp_session::handle_read_msg,
                               shared_from_this(),
                              boost::asio::placeholders::error,
                         boost::asio::placeholders::bytes_transferred,
                               req)));

}
//异步读取消息
void tcp_session::handle_read_msg(const boost::system::error_code &error,
size_t byte_transferred,
tcp_request_ptr req)
{
bool bRight = req->check_msg_crc();
//检查消息体是否正确
if (error || !bRight)
{
close();
return;
}

//step6-->将收到的消息加入到job_queue
//m_queue是从外部传来的消息队列
//此处是将该连接读取的所有数据都保存在该队列中
//类似于生产者
m_queue.push(req);

//启动新的异步读
read_data();

}
bool tcp_session::isconnected()
{
bool bFlag = false;
m_bconnected.getValue(bFlag);
return bFlag;
}
/ * /启动异步写
void tcp_session::write(tcp_response_ptr resp)
{
boost::asio::async_write(m_socket,
boost::asio::buffer(resp->head_data().data(), resp->head_data().size()),
m_strand.wrap(
boost::bind(&tcp_session::handle_write_head,
shared_from_this(),
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred,
resp)));
}
void tcp_session::handle_write_head(const boost::system::error_code &error,
size_t bytes_transferred,
tcp_response_ptr resp)
{
if (error || bytes_transferred != resp->head_data().size())
{
close();
return;
}
boost::asio::async_write(m_socket,
boost::asio::buffer(resp->msg_data().data(), resp->get_head()->size),
m_strand.wrap(
boost::bind(&tcp_session::handle_write_msg,
shared_from_this(),
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred,
resp)));
}
*

void tcp_session::handle_write_msg(const boost::system::error_code &error,
size_t byte_transferred,
tcp_response_ptr resq)
{
if (error || byte_transferred != resq->get_head()->size)
{
close();
return;
}

//消息发送完毕以后,就应该释放内存
resq->destroy();

}

时间: 2024-10-01 02:37:36

c++ 编程问题-高人来帮助下小弟,纠结到吐血的问题的相关文章

手游新手 unity3d-有没有现在做手游的前辈能指导下小弟的前路啊?

问题描述 有没有现在做手游的前辈能指导下小弟的前路啊? 小弟今年刚刚毕业,现在在做javaweb相关的工作.但是我最初学编程就是想做游戏.所以想转行做手游.我现在有的基础(java基础,html,js,jquery,数据库等)安卓最近在看.我想知道下一步应该怎么样去系统的学习?还有现在主流的手游框架 unity3D 貌似是用 js 和 c#写的,还有没有适合java游戏引擎能推荐的?或者我要学习unity3D应该从哪里入手.

udp java-JAVA UDP协议下怎么样才能突破局域网内的双向通信啊?求高人务必指导下。。。。

问题描述 JAVA UDP协议下怎么样才能突破局域网内的双向通信啊?求高人务必指导下.... 本人是个接触JAVA2个月的菜鸟,最近在研究UDP广域网的通信,实现的过程也就是常说的双向通信:客户端(局域网内)先发数据给远方的服务器(服务器是公网IP,映射了个端口),服务器能收到,但是服务器不能回发数据给客户端...对于这方面的问题,在网上找了很多资料,全是局域网内的,网上说什么UDP打洞啊,穿透啊等等的,说实话有点晕,直到有一天在网上一个论坛看到同样类似的帖子,主人说根本就不需要什么UDP打洞这

c语言-“熟悉win32环境下编程”其中的win32环境下编程是不是就是c/c++那个编程环境啊?

问题描述 "熟悉win32环境下编程"其中的win32环境下编程是不是就是c/c++那个编程环境啊? 如题?"熟悉win32环境下编程"其中的win32环境下编程是不是就是c/c++那个编程环境啊?多谢 解决方案 字面意思很明白了,win32环境编程,首先是windows 其次是32位机,为什么要和c++关联起来呢? 解决方案二: C/C++可以写 Win32 的程序,也可以写 Linux 的程序.这里的 Win32,主要是指 Win32 API,如 windows

遇到一个棘手的问题,需要java网络编程大神帮忙解答下~

问题描述 遇到一个棘手的问题,需要java网络编程大神帮忙解答下~ 问题是这样的: 我把MINA核心的非阻塞轮训方式的的代码用JDK7的AIO异步IO替换了,现在已经包装完成,测试的时候遇到两个问题: 测试的是这样的,服务端启动后20秒后释放所有资源关闭,客户端启动15秒后释放所有资源关闭,大部分情况下测试都是正常的,但是偶尔会出现客户端服务端都关闭后,再次启动服务的过程后,要么服务端抛出AsynchronousCloseException,客户端抛出远程主机强迫关闭一个现有连接:要么是客户端的

c语言-Linux C编程:将Linux根目录下指定的一个文件夹内的所以文件按创建时间排序

问题描述 Linux C编程:将Linux根目录下指定的一个文件夹内的所以文件按创建时间排序 Linux C编程:将Linux根目录下指定的一个文件夹内的所以文件按创建时间排序,并删除创建时间最靠前的100个文件.请大神赐教代码,非常非常感谢!! 解决方案 http://blog.csdn.net/kesaihao862/article/details/6657399

socket通信-关于socket编程在java与c下的传输问题

问题描述 关于socket编程在java与c下的传输问题 最近在做一个项目,使用c写的客户端,用java写的服务器,客户端传输结构体,采用函数memcpy转换为字符串传输,那么在服务器端应该如何接受并解析??目前为止本人一直接受到的都是乱码 解决方案 Java Socket 网络编程问题剖析Java socket编程时readLine()问题网络编程感想(一)基于socket传输延迟问题---------------------- 解决方案二: 检查双方编码是否一致? 解决方案三: 是不是输入流

new-Kmeans算法初学者,想请教大神,编程不怎么强麻烦解释下谢谢

问题描述 Kmeans算法初学者,想请教大神,编程不怎么强麻烦解释下谢谢 List<ArrayList<Double>> centers = new ArrayList<ArrayList<Double>>(); List<ArrayList<Double>> newCenters = new ArrayList<ArrayList<Double>>(); List<ArrayList<ArrayL

Android编程使用Fragment界面向下跳转并一级级返回的实现方法_Android

本文实例讲述了Android编程使用Fragment界面向下跳转并一级级返回的实现方法.分享给大家供大家参考,具体如下: 1.首先贴上项目结构图: 2.先添加一个接口文件BackHandledInterface.java,定义一个setSelectedFragment方法用于设置当前加载的Fragment在栈顶,主界面MainActivity须实现此接口,代码如下: package com.example.testdemo; public interface BackHandledInterfa

求救-各位大神们能不能帮忙解释下小弟初学者

问题描述 各位大神们能不能帮忙解释下小弟初学者 http://blog.csdn.net/xuyouqiao2005/article/details/38173019 解决方案 说说清楚 要解释什么呢?