请问,对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,这种的变量的赋值是否有点特别。以上这些都是我的疑问,请高手真的帮忙看看,自己已经搞了很久。谢谢!!

解决方案 »

  1.   

    你没有给sClientObj申请内存空间
      

  2.   

    CDGSocket sClientObj;
    该句在函数中声明,作用域也是在函数中,返回的是个什么啊,未知的内存指针?
    而第一个函数是引用,对象不会释放,指针也是有效的
      

  3.   

    第二个函数:return sClientObj;->return &sClientObj;
    CDGSocket *sClient;
    sClient = sServer.AcceptClient();
      

  4.   

    首先谢谢各位的捧场。
    但是这里我要说一下:
     to jacklzw88:
    我是声明了局部变量,怎么会没分配空间呢?不知道从何说起,请指教。to Elysium:
    CDGSocket sClientObj是在函数中声明,但是,这里的返回应该会触发拷贝构造函数的执行,把变量复制回去,再析构本身,这个变量是会传回去的,你可以试试其他的对象的返回,这是可以的。所以这里你说的我不明白,请指教。to quanxiaozhou:
    你这样写,就会出现局部变量已经析构了,返回的是一个被释放对象的指针,这样的代码是错误的。请各位大虾再仔细看看,我在此先谢过了!
      

  5.   

    用 static 的对象或者是 堆对象 。
    传递个引用或者指针就挺好 。
      

  6.   

    CDGSocket sClient;
    sClient = sServer.AcceptClient();并没有 分配一个有效地m_hSocket
      

  7.   

    还有就是你传递了一个引用,谁知道你这个引用在别的地方是不是还作了什么事情,而你在第二个函数中只是accept,也没有bind,listen...
      

  8.   

    各位,问题的答案已经在我发的C++ 社区中找到了,不过还是谢谢各位。答案的贴地址如下:http://community.csdn.net/Expert/topic/4896/4896297.xml?temp=6.677508E-04
      

  9.   

    建议楼主看一下<深度...C++>那本书,加深对C++对象的本质认识,这样就可以避免类似的错误了