导航:首页 > 网络设置 > socket设置网络连接超时时间

socket设置网络连接超时时间

发布时间:2023-02-03 03:55:50

⑴ LINUX C 进行TCP网络连接,怎样设置连接超时时间

如果你确定,真的不需要等这么久,或者用户希望可以随时中上连接过程,那么一般是用 非阻塞模式来做的. 看看我的这段连接代码(节选),可以作为TCP连接的典范:

bool CRemoteLink::Connect()
{
OnDisconnected(); // 如果已经连接,则断开

if(!m_bUseProxy)
{

m_iConnStatus = SS_CONNECTING; // 正在连接状态
GNTRACE ("开始连接到远程服务器[%s][%ld]...\n", m_strip.c_str(), m_port);

// 建立套接字, 准备连接到服务器
m_socket = ::socket(AF_INET, SOCK_STREAM, 0);
if (socket < 0) {
if(m_pCallBack)
m_pCallBack->OnSocketError(SE_CREATE, MSG_SE_CREATE);
return false;
}

// 设为异步操作方式
unsigned long on = 1;
if (::ioctlsocket(m_socket, FIONBIO, &on) < 0) {
::closesocket(m_socket);
if(m_pCallBack)
m_pCallBack->OnSocketError(SE_CREATE, MSG_SE_CREATE);
return false;
}

sockaddr_in addr;
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr(m_strip.c_str());
addr.sin_port = htons(m_port);

int rt;
rt = ::connect(m_socket, (sockaddr *) &addr, sizeof(addr));
if (rt == 0) {
OnConnected();
return true;
}

// ==================================================================
timeval to;

// 首先建立连接
fd_set wfds;
fd_set efds;
FD_ZERO(&wfds);
FD_ZERO(&efds);

// test shutdown event each 100ms.
to.tv_sec = 0;
// CONNECT_TIMEOUT;
to.tv_usec = 100000;

int it = 0;
while(!m_meShutdown.Wait(0) && !m_meConnStop.Wait(0))
{
FD_SET(m_socket, &wfds);
FD_SET(m_socket, &efds);
int n = select(m_socket + 1, NULL, &wfds, &efds, &to);

if (n > 0) {
if(FD_ISSET(m_socket, &wfds))
{
OnConnected();
return true;
}
else
{
//int err = ::WSAGetLastError();
//const char* msg = GetLastErrorMessage(err);
GNTRACE ("CRemoteLink::Connect : connection attempt failed!\n");
if(m_pCallBack)
m_pCallBack->OnSocketError(SE_CONN, MSG_SE_CONN);
break;
}
} else if (n < 0) { // Select Error
int err = ::WSAGetLastError();
const char* msg = GetLastErrorMessage(err);
GNTRACE ("CRemoteLink::Connect : Select Error.[%d] - %s\n", err, msg);
if(m_pCallBack)
m_pCallBack->OnSocketError(err, msg);
break;
}
else
{
it += 100;
if(it > 30000) // 连接超时 -- (30S)
{
GNTRACE ("CRemoteLink::Connect : Time out.\n");
if(m_pCallBack)
m_pCallBack->OnSocketError(SE_TIMEOUT, MSG_SE_TIMEOUT);
break;
}
}
}
if(m_meConnStop.Wait(0))
{
GNTRACE("连接过程进行时被取消。\n");
}
}
else
{
// 通过代理服务器连接

⑵ 如何控制C#Socket的连接超时时间

1.使用BeginConnect方法
IAsyncResult
connResult
=
mySocket.BeginConnect(yourAddress,
yourPort,
null,
null);
connResult.AsyncWaitHandle.WaitOne(2000,
true);
//等待2秒
if
(!connResult.IsCompleted)
{
mySocket.Close();
//处理连接不成功的动作
}
else
{
//处理连接成功的动作
}
这种方法很好的控制了连接超时时间而且代码非常简单,但是界面仍然会有2秒的卡死产生。如果想解决该问题,则需要创建一个额外的线程来执行WaitOne方法。
2.使用ConnectAsync方法
SocketAsyncEventArgs
e
=
new
SocketAsyncEventArgs();
e.Completed
+=
new
EventHandler<SocketAsyncEventArgs>(AsyncConnected);
e.RemoteEndPoint
=
new
IPEndPoint(IPAddress.Parse(yourAddress),
yourPort);

⑶ socket怎么设置超时

socket.setSoTimeout(int timeout);
恩。应该能实现你的要求

首先socket不是一个阻塞方法,它不会自动去连serverSocket,而是你connect一次它就去连一次,socket本身不存在什么连接server端超时,所以客户端的连接超时是由你的程序去控制的,比如用线程。

其次,恶意连接这个问题,其实我已经给你解决了,在server端拿到socket后,不就能用socket.setSoTimeout()来设置连接时间了么?

⑷ socket连接超时怎么解决啊

调大timeout参数值。网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。当socket连接超时调大timeout参数值,可以解决连接超时的问题。timeout就是连接等待的时间参数,把原来的等待时间调大即可。

⑸ 如何控制C#Socket的连接超时时间

Socket.connect连接超时有二种情况: 1.由于网络的问题,TCP/IP三次握手时间>timeout的设置时间。这在国外访问weibo时,并且网络环境极差的情况下有可能发生。解决的办法:调大socket.connect方法中的timeout参数值,比如50s,linux默认最高是70s,如果超过70s没有意义,linux会采用70s.但是当调大之后,发现不到10s就报timeout exception。通过国外的机器ping api.weibo.com发现unreachable。说明客户端在传输层之下的网络层就发现连个Syn的报文都发不出去,更不用说三次握手了,客户端直接失败并抛timeout exception。 经验:在connection timeout诊断的第一步应该是ping一下确认网络层没有问题。注:客户端设置了timeout,但并不会等到超时才返回异常。客户端只要第一时间发现连接失败,就会抛timeout exception。2.如果timeout设置的时间足够,但是由于服务器端的处理能力较差,比如缓冲连接队列较小,而应用层的处理能力没有连接缓冲快,导致缓冲连接占满,而拒绝新的连接。在服务端因为连接队列占满而拒绝服务的期间,客户端的通过TCP协议重试三次。每次的时间翻倍。如果三次时间的累加<timeout参数值且能连接上,属于正常情况,表示队列腾出空位放当前连接。如果三次时间的累加<timeout参数值且未能连接上,则客户端会立刻抛出timeout exception,而不等timeout到期才抛。 下面是一个异步socket典型的连接程序connectDone 是ManualResetEvent类型可以在connectDone.WaitOne();中使用等待的时间来限制连接超时比如connectDone.WaitOne(5000);是超时时间为5秒connectDone.WaitOne(); public void Conn(){try{ClientSocket=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);IPAddress ipAddress = IPAddress.Parse(tcpIpServerIP);IPEndPoint remoteEP = new IPEndPoint(ipAddress, tcpIpServerPort);connectDone.Reset();ClientSocket.BeginConnect(remoteEP,new AsyncCallback(ConnectCallback),ClientSocket);connectDone.WaitOne();StateObject state = new StateObject(bufferSize,ClientSocket);ClientSocket.BeginReceive(state.buffer,0,bufferSize,0,new AsyncCallback(ReceiveCallback), state);}catch(Exception e){OnErrorEvent(new ErrorEventArgs(e));}}所有代码见:http://blog.csdn.net/ang75/article/details/75915

⑹ 如何设置socket的Connect超时

针对套接字操作设置默认超时的概述StreamSocket类实现Windows运行时应用中的TCP套接字。TCP套接字必须建立连接才能发送或接收任何网络数据。Windows8.1、WindowsPhone8.1和WindowsServer2012中实现的基础TCP套接字会针对所有的TCP连接套接字操作设置默认超时。对于每个来源和目标地址对,在使用主机名或终结点时,默认超时为3分钟(180秒)。因此,如果目标主机名有两个IP地址,那么,只有在经过大约6分钟之后,连接操作才会超时。对于使用Windows运行时应用的客户体验来说,这个默认超时可能过长。因此,使用StreamSocket类的应用可能希望针对流套接字连接操作设置较短的自定义超时。在发送或接收网络数据时,DatagramSocket和StreamSocket类没有默认超时。因此,任何发送或接收操作都将永远等待。使用套接字的Windows运行时应用可能希望针对这些操作设置超时以获取更好的客户体验。StreamSocketListener类将永远侦听和等待传入的连接请求。如何针对套接字操作设置自定义超时JavaScript语言支持计时事件,这些事件可以按指定的时间间隔执行某些代码。JavaScript计时事件setInterval()-按指定的时间间隔(毫秒)反复执行某个函数。setTimeout()-在等待指定的毫秒之后执行一次某个函数。计时事件函数是在HTMLDOMWindow对象中实现的。WinJS命名空间为包括WinJS.Promise对象的JavaScript功能提供特殊的Windows库。timeout(timeout,promise)方法包装setTimeout函数。如果在timeout参数中指定的毫秒数内未完成承诺,则Windows应用商店应用可以使用timeout(timeout,promise)方法来取消此承诺。如果在timeout参数中指定的时间间隔内未完成套接字操作,则可以调用timeout(timeout,promise)方法并将套接字操作作为promise参数以使该操作超时。只要套接字操作仍在挂起,就能将其取消。WinJS.Promise对象和timeout(timeout,promise)方法可以与Windows运行时应用中的任何异步操作一起使用,包括所有的异步套接字操作。对于正常的完成操作,可以在timeout(timeout,promise)方法调用之后添加逗.then地。对于所有这三个类来说,使用超时的基本模型是相同的。以下讨论使用StreamSocket上的连接操作作为示例。在使用DatagramSocket或StreamSocket对象发送或接收网络数据时,或者在使用StreamSocketListener对象侦听传入连接时,可以使用相同的模型来实现超时。创建一个StreamSocket。调用timeout(timeout,promise)方法并将其中一个StreamSocket.connectAsync方法作为promise参数。在源代码的末尾添加then(successFunction,errorFunction)方法来处理成功和错误案例。在出错时,关闭套接字。在取消StreamSocket操作承诺之后,将无法再使用已取消的StreamSocket。以下示例将针对StreamSocket连接操作实现自定义超时。JavaScriptvarclientSocket=null;vartimeout=10000;//10secondsfunctionopenClient(){varserverHostName=newWindows.Networking.HostName("");varserviceName="http";//displayStatus("Client:connectionstarted.");clientSocket=newWindows.Networking.Sockets.StreamSocket();//varpromise=clientSocket.connectAsync(serverHostName,serviceName)WinJS.Promise.timeout(timeout,clientSocket.connectAsync(serverHostName,serviceName).then(function(){//displayStatus("Client:connectioncompleted.");//Doyoursocketoperationshere.},function(reason){//:thepromisemighthave//timedout,,orthere//wasanTCPissue,orseveralotherpossibilities.//displayStatus("Client:connectionfailed.");//displayStatus(reason.message);clientSocket.close();clientSocket=null;}));}

⑺ Socket 连接 过程中超时问题的处理

根据公司需要最近所了一个广播通信的项目,交给测试的时候发现在广播的过程中经常会出现断线的问题,回来自己亲测确实有这样的问题,但是很奇怪的是在下班后再去测试这样的问题就基本不会出现 ,什么原因呢很困惑 ,开始还怀疑是不是音频录入采样参数设置出了什么问题,最后确定不是,就分析是不是Socket连接出了问题 后来一看还真是。

你会看到这样的错误:ErrorDomain=GCDAsyncSocketErrorDomain Code=4 "Read operation timed out"UserInfo=0xa8db6a0 {NSLocalizedDescription=Read operation timed out}

断点调试出你自己的超时时间,系统给的设置是 if (timeout >= 0.0),只需要把你的超时时间修改为你调试出的超时时间大就OK了!

阅读全文

与socket设置网络连接超时时间相关的资料

热点内容
网络共享中心没有网卡 浏览:513
电脑无法检测到网络代理 浏览:1364
笔记本电脑一天会用多少流量 浏览:549
苹果电脑整机转移新机 浏览:1368
突然无法连接工作网络 浏览:1031
联通网络怎么设置才好 浏览:1213
小区网络电脑怎么连接路由器 浏览:1007
p1108打印机网络共享 浏览:1203
怎么调节台式电脑护眼 浏览:668
深圳天虹苹果电脑 浏览:907
网络总是异常断开 浏览:603
中级配置台式电脑 浏览:964
中国网络安全的战士 浏览:623
同志网站在哪里 浏览:1404
版观看完整完结免费手机在线 浏览:1449
怎样切换默认数据网络设置 浏览:1099
肯德基无线网无法访问网络 浏览:1275
光纤猫怎么连接不上网络 浏览:1446
神武3手游网络连接 浏览:956
局网打印机网络共享 浏览:991