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