后来我用LOG确定是新建一个socket时消失的,
我加上了try(...)catch(){}语句结果还真捕捉到一个错误!
可是MSDN上并没有说呀?请问各位大侠这是怎么回事哩?
急!急!急!
13 个解决方案
#1
自己顶一下!
兄弟们帮忙啦!
兄弟们帮忙啦!
#2
GetLastError看什么错误
#3
你用的什么?MFC里面封装的socket还是一般的Winsock API?
如果是一般的API,这个错误肯定不是winsock函数本身抛出的,而是你编码的某个错误造成的。C++的try catch基本上可以捕捉所有的异常,譬如对0地址的访问等等……
如果是一般的API,这个错误肯定不是winsock函数本身抛出的,而是你编码的某个错误造成的。C++的try catch基本上可以捕捉所有的异常,譬如对0地址的访问等等……
#4
是API函数.
用WSAGetLastError返回0,没有错误.
那有没有办法知道这是个什么错误哩?
用WSAGetLastError返回0,没有错误.
那有没有办法知道这是个什么错误哩?
#5
当然没有错误了,WSAGetLastError返回的是Winsock的错误,而你这个异常肯定不是socket函数抛出的,因为Winsock API是C API,没有异常这个东西,所以这个异常来自于其他部分,当然就不可能用WSAGetLastError得到了(异常和错误并非一类东西,这个概念要分清楚)。
可能传递了错误的参数,譬如传递了0给某个指针,这个只有异常可以捕捉到,无论是哪个错误函数都是没办法得到的……
异常是一种控制方式,而不是来检测错误的机制,在异常抛出的地方后面的代码都不会被执行,直接进入异常处理程序了……
可能传递了错误的参数,譬如传递了0给某个指针,这个只有异常可以捕捉到,无论是哪个错误函数都是没办法得到的……
异常是一种控制方式,而不是来检测错误的机制,在异常抛出的地方后面的代码都不会被执行,直接进入异常处理程序了……
#6
Winsock API是不会抛异常的
你在程序里多对一些指针之类的做一下判断,还有一些函数,检查一下他们是否运行成功才执行下一步操作的。
你在程序里多对一些指针之类的做一下判断,还有一些函数,检查一下他们是否运行成功才执行下一步操作的。
#7
我的代码如下:
try
{
if (mSocket != INVALID_SOCKET)
{
closesocket(mSocket);
mSocket = INVALID_SOCKET;
}
mSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//不加try时,运行到这里程序自动退出,无任何提示,加try时,捕捉到一个错误.并且以后程序运行到这里都会捕捉到这个错误.
}
catch(...)
{
int error = WSAGetLastError();
}
我的程序是一个网络服务器程序,它不断的接受客户机的请求,并建立TCP连接.
我的错误也是在程序运行一段时间之后才会出现,并且在这一段时间中,这个语句也被正确执行了上千次.
try
{
if (mSocket != INVALID_SOCKET)
{
closesocket(mSocket);
mSocket = INVALID_SOCKET;
}
mSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//不加try时,运行到这里程序自动退出,无任何提示,加try时,捕捉到一个错误.并且以后程序运行到这里都会捕捉到这个错误.
}
catch(...)
{
int error = WSAGetLastError();
}
我的程序是一个网络服务器程序,它不断的接受客户机的请求,并建立TCP连接.
我的错误也是在程序运行一段时间之后才会出现,并且在这一段时间中,这个语句也被正确执行了上千次.
#8
怀疑是内存泄漏了……
资源不足可能导致这样的错误发生……
资源不足可能导致这样的错误发生……
#9
如果是个网络服务器,不断接收连接的话
应该是一个listen用的socket和若干accept用的socket
看楼主的代码,mSocket应该是listen用的,但他为何要不断的建立和关闭?
应该是一个listen用的socket和若干accept用的socket
看楼主的代码,mSocket应该是listen用的,但他为何要不断的建立和关闭?
#10
这是我的设计上的一个失误!
我是用UDP发送命令,TCP发送数据.
客户机向服务器发送如连接,断开连接,请求发送数据,暂停,停止等UDP命令.
服务器收到连接的命令后,向客户机请求TCP连接.
这个mSocket就是用来发送数据用的.
我的listen用的socket和accept用的socket都在客户机.
不知道这个失误和程序突然消失有没有直接联系?谢谢!
我是用UDP发送命令,TCP发送数据.
客户机向服务器发送如连接,断开连接,请求发送数据,暂停,停止等UDP命令.
服务器收到连接的命令后,向客户机请求TCP连接.
这个mSocket就是用来发送数据用的.
我的listen用的socket和accept用的socket都在客户机.
不知道这个失误和程序突然消失有没有直接联系?谢谢!
#11
顶一下.
#12
这样啊
服务端收到连接命令后,向客户端请求TCP连接
是不是一次命令一个连接,不断建立连接,释放连接,这样可能导致资源用尽的
因为数据传输结束后要关闭套接字,但关闭后的端口并不一定是立即可用的,可能会有TIME_WAIT的过程(TIME_WAIT的时间可能是半分钟到2分钟,要看操作系统),这时刚才断开的SOCKET所使用的端口不可用,时间长了,可能导致端口都不可用。
TCP连接是一直连着的,直到双方通讯结束为止,而且你这样不断建立释放连接,效率也是很低的。
我上面分析的不一定准确,只能参考一下,但你这样频繁建立释放连接的做法肯定是不合理的。
服务端收到连接命令后,向客户端请求TCP连接
是不是一次命令一个连接,不断建立连接,释放连接,这样可能导致资源用尽的
因为数据传输结束后要关闭套接字,但关闭后的端口并不一定是立即可用的,可能会有TIME_WAIT的过程(TIME_WAIT的时间可能是半分钟到2分钟,要看操作系统),这时刚才断开的SOCKET所使用的端口不可用,时间长了,可能导致端口都不可用。
TCP连接是一直连着的,直到双方通讯结束为止,而且你这样不断建立释放连接,效率也是很低的。
我上面分析的不一定准确,只能参考一下,但你这样频繁建立释放连接的做法肯定是不合理的。
#13
谢谢!
先试一下,看看有没有效果!
先试一下,看看有没有效果!
#1
自己顶一下!
兄弟们帮忙啦!
兄弟们帮忙啦!
#2
GetLastError看什么错误
#3
你用的什么?MFC里面封装的socket还是一般的Winsock API?
如果是一般的API,这个错误肯定不是winsock函数本身抛出的,而是你编码的某个错误造成的。C++的try catch基本上可以捕捉所有的异常,譬如对0地址的访问等等……
如果是一般的API,这个错误肯定不是winsock函数本身抛出的,而是你编码的某个错误造成的。C++的try catch基本上可以捕捉所有的异常,譬如对0地址的访问等等……
#4
是API函数.
用WSAGetLastError返回0,没有错误.
那有没有办法知道这是个什么错误哩?
用WSAGetLastError返回0,没有错误.
那有没有办法知道这是个什么错误哩?
#5
当然没有错误了,WSAGetLastError返回的是Winsock的错误,而你这个异常肯定不是socket函数抛出的,因为Winsock API是C API,没有异常这个东西,所以这个异常来自于其他部分,当然就不可能用WSAGetLastError得到了(异常和错误并非一类东西,这个概念要分清楚)。
可能传递了错误的参数,譬如传递了0给某个指针,这个只有异常可以捕捉到,无论是哪个错误函数都是没办法得到的……
异常是一种控制方式,而不是来检测错误的机制,在异常抛出的地方后面的代码都不会被执行,直接进入异常处理程序了……
可能传递了错误的参数,譬如传递了0给某个指针,这个只有异常可以捕捉到,无论是哪个错误函数都是没办法得到的……
异常是一种控制方式,而不是来检测错误的机制,在异常抛出的地方后面的代码都不会被执行,直接进入异常处理程序了……
#6
Winsock API是不会抛异常的
你在程序里多对一些指针之类的做一下判断,还有一些函数,检查一下他们是否运行成功才执行下一步操作的。
你在程序里多对一些指针之类的做一下判断,还有一些函数,检查一下他们是否运行成功才执行下一步操作的。
#7
我的代码如下:
try
{
if (mSocket != INVALID_SOCKET)
{
closesocket(mSocket);
mSocket = INVALID_SOCKET;
}
mSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//不加try时,运行到这里程序自动退出,无任何提示,加try时,捕捉到一个错误.并且以后程序运行到这里都会捕捉到这个错误.
}
catch(...)
{
int error = WSAGetLastError();
}
我的程序是一个网络服务器程序,它不断的接受客户机的请求,并建立TCP连接.
我的错误也是在程序运行一段时间之后才会出现,并且在这一段时间中,这个语句也被正确执行了上千次.
try
{
if (mSocket != INVALID_SOCKET)
{
closesocket(mSocket);
mSocket = INVALID_SOCKET;
}
mSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//不加try时,运行到这里程序自动退出,无任何提示,加try时,捕捉到一个错误.并且以后程序运行到这里都会捕捉到这个错误.
}
catch(...)
{
int error = WSAGetLastError();
}
我的程序是一个网络服务器程序,它不断的接受客户机的请求,并建立TCP连接.
我的错误也是在程序运行一段时间之后才会出现,并且在这一段时间中,这个语句也被正确执行了上千次.
#8
怀疑是内存泄漏了……
资源不足可能导致这样的错误发生……
资源不足可能导致这样的错误发生……
#9
如果是个网络服务器,不断接收连接的话
应该是一个listen用的socket和若干accept用的socket
看楼主的代码,mSocket应该是listen用的,但他为何要不断的建立和关闭?
应该是一个listen用的socket和若干accept用的socket
看楼主的代码,mSocket应该是listen用的,但他为何要不断的建立和关闭?
#10
这是我的设计上的一个失误!
我是用UDP发送命令,TCP发送数据.
客户机向服务器发送如连接,断开连接,请求发送数据,暂停,停止等UDP命令.
服务器收到连接的命令后,向客户机请求TCP连接.
这个mSocket就是用来发送数据用的.
我的listen用的socket和accept用的socket都在客户机.
不知道这个失误和程序突然消失有没有直接联系?谢谢!
我是用UDP发送命令,TCP发送数据.
客户机向服务器发送如连接,断开连接,请求发送数据,暂停,停止等UDP命令.
服务器收到连接的命令后,向客户机请求TCP连接.
这个mSocket就是用来发送数据用的.
我的listen用的socket和accept用的socket都在客户机.
不知道这个失误和程序突然消失有没有直接联系?谢谢!
#11
顶一下.
#12
这样啊
服务端收到连接命令后,向客户端请求TCP连接
是不是一次命令一个连接,不断建立连接,释放连接,这样可能导致资源用尽的
因为数据传输结束后要关闭套接字,但关闭后的端口并不一定是立即可用的,可能会有TIME_WAIT的过程(TIME_WAIT的时间可能是半分钟到2分钟,要看操作系统),这时刚才断开的SOCKET所使用的端口不可用,时间长了,可能导致端口都不可用。
TCP连接是一直连着的,直到双方通讯结束为止,而且你这样不断建立释放连接,效率也是很低的。
我上面分析的不一定准确,只能参考一下,但你这样频繁建立释放连接的做法肯定是不合理的。
服务端收到连接命令后,向客户端请求TCP连接
是不是一次命令一个连接,不断建立连接,释放连接,这样可能导致资源用尽的
因为数据传输结束后要关闭套接字,但关闭后的端口并不一定是立即可用的,可能会有TIME_WAIT的过程(TIME_WAIT的时间可能是半分钟到2分钟,要看操作系统),这时刚才断开的SOCKET所使用的端口不可用,时间长了,可能导致端口都不可用。
TCP连接是一直连着的,直到双方通讯结束为止,而且你这样不断建立释放连接,效率也是很低的。
我上面分析的不一定准确,只能参考一下,但你这样频繁建立释放连接的做法肯定是不合理的。
#13
谢谢!
先试一下,看看有没有效果!
先试一下,看看有没有效果!