请帮忙看看,socket包装类的问题。

dylgsy 2006-07-21 04:41:07
请问,对socket进行包装,其中一个方法是接受客户端的连接。以下的两个函数,一个有问题,一个没问题。请帮忙看看!
1、这个函数是没问题的,把对象用引用传进去
void CDGSocket::AcceptClient(CDGSocket &s)
{
struct sockaddr_in cliAddrTmp;
int cliAddrSize = sizeof(struct sockaddr_in);
SOCKET sClient = accept(m_hSocket, (struct sockaddr *)&cliAddrTmp, &cliAddrSize);
if(sClient == INVALID_SOCKET)
{
ThrowException("accept() failed!");
}

s.m_hSocket = sClient;
}

客户程序的调用如下:
CDGSocket sClient;
sServer.AcceptClient(sClient);

2、这个函数是有问题的
CDGSocket CDGSocket::AcceptClient()
{
CDGSocket sClientObj;

struct sockaddr_in cliAddrTmp;
int cliAddrSize = sizeof(struct sockaddr_in);
sClientObj.m_hSocket = accept(m_hSocket, (struct sockaddr *)&cliAddrTmp, &cliAddrSize);
if(sClientObj.m_hSocket == INVALID_SOCKET)
{
ThrowException("accept() failed!");
}

return sClientObj;
}
客户程序是这样调用的:
CDGSocket sClient;
sClient = sServer.AcceptClient();
但是就在返回的时候程序出现了异常,我非常迷惑这里是什么原因造成的。

我的拷贝构造函数是这样的,里面没有其他的成员变量,也没有动态开辟的空间。
按道理来说应该不需要拷贝构造函数。
CDGSocket::CDGSocket(const CDGSocket &s)
{
m_hSocket = s.m_hSocket;
}

我自己尝试解决所做的试验:
1、跟踪出错函数的时候程序是这样跑的:
return sClientObj;--> 拷贝构造函数--〉析构函数--〉返回--〉出错

开始猜想可能是拷贝构造函数的问题,但是试了一下其他的拷贝内存的方法,也没什么用。

2、查看了MSDN中SOCKET的解释,发现,SOCKET其实就是unsigned int,是一个由Windows分配的句柄值,有点类似于HWND,这种的变量的赋值是否有点特别。

以上这些都是我的疑问,请高手真的帮忙看看,自己已经搞了很久。谢谢!!

...全文
188 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
Practise_Think 2006-07-23
  • 打赏
  • 举报
回复
建议楼主看一下<深度...C++>那本书,加深对C++对象的本质认识,这样就可以避免类似的错误了
dylgsy 2006-07-23
  • 打赏
  • 举报
回复
各位,问题的答案已经在我发的C++ 社区中找到了,不过还是谢谢各位。答案的贴地址如下:

http://community.csdn.net/Expert/topic/4896/4896297.xml?temp=6.677508E-04
Elysium 2006-07-22
  • 打赏
  • 举报
回复
还有就是你传递了一个引用,谁知道你这个引用在别的地方是不是还作了什么事情,而你在第二个函数中只是accept,也没有bind,listen...
abomber2 2006-07-22
  • 打赏
  • 举报
回复
CDGSocket sClient;
sClient = sServer.AcceptClient();

并没有 分配一个有效地m_hSocket
guyanhun 2006-07-22
  • 打赏
  • 举报
回复
用 static 的对象或者是 堆对象 。
传递个引用或者指针就挺好 。
dylgsy 2006-07-22
  • 打赏
  • 举报
回复
首先谢谢各位的捧场。
但是这里我要说一下:
to jacklzw88:
我是声明了局部变量,怎么会没分配空间呢?不知道从何说起,请指教。

to Elysium:
CDGSocket sClientObj是在函数中声明,但是,这里的返回应该会触发拷贝构造函数的执行,把变量复制回去,再析构本身,这个变量是会传回去的,你可以试试其他的对象的返回,这是可以的。所以这里你说的我不明白,请指教。

to quanxiaozhou:
你这样写,就会出现局部变量已经析构了,返回的是一个被释放对象的指针,这样的代码是错误的。

请各位大虾再仔细看看,我在此先谢过了!
quanxiaozhou 2006-07-21
  • 打赏
  • 举报
回复
第二个函数:return sClientObj;->return &sClientObj;
CDGSocket *sClient;
sClient = sServer.AcceptClient();
Elysium 2006-07-21
  • 打赏
  • 举报
回复
CDGSocket sClientObj;
该句在函数中声明,作用域也是在函数中,返回的是个什么啊,未知的内存指针?
而第一个函数是引用,对象不会释放,指针也是有效的
jacklzw88 2006-07-21
  • 打赏
  • 举报
回复
你没有给sClientObj申请内存空间

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧