请问,对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、这个函数是没问题的,把对象用引用传进去
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,这种的变量的赋值是否有点特别。以上这些都是我的疑问,请高手真的帮忙看看,自己已经搞了很久。谢谢!!
该句在函数中声明,作用域也是在函数中,返回的是个什么啊,未知的内存指针?
而第一个函数是引用,对象不会释放,指针也是有效的
CDGSocket *sClient;
sClient = sServer.AcceptClient();
但是这里我要说一下:
to jacklzw88:
我是声明了局部变量,怎么会没分配空间呢?不知道从何说起,请指教。to Elysium:
CDGSocket sClientObj是在函数中声明,但是,这里的返回应该会触发拷贝构造函数的执行,把变量复制回去,再析构本身,这个变量是会传回去的,你可以试试其他的对象的返回,这是可以的。所以这里你说的我不明白,请指教。to quanxiaozhou:
你这样写,就会出现局部变量已经析构了,返回的是一个被释放对象的指针,这样的代码是错误的。请各位大虾再仔细看看,我在此先谢过了!
传递个引用或者指针就挺好 。
sClient = sServer.AcceptClient();并没有 分配一个有效地m_hSocket