linuxtcp断开
A. linux系统下的c语言的网络socket的编程,作为client端去连接服务器段,为什么之间会突然断开!求高手指点!
在出错函数(socket)后面用printf("%m\n");打印出来可以知道出错的原因
%m表示errno和strerror(errno)
或者不怕麻烦的话添加头文件<error.h>
然后还是在出错的函数socket()后面添加打印信息printf("%d|%s\n", error, strerror(errno));
error表示该函数的出错码,后面的表示英文解释,具体的可以在linux下用慢查找
虽然这个办法笨了点。但是我只会这种方法....
你有抓包看了吗 linux下用tcpmp -w抓到本地来看 本地用wireshark抓 一抓包啥东西都清清楚楚
B. linux下有系统tcp连接超时时间么
可以作为TCP连接的典范:
boolCRemoteLink::Connect()
{
OnDisconnected();//如果已经连接,则断开
if(!m_bUseProxy)
{
m_iConnStatus=SS_CONNECTING;//正在连接状态
GNTRACE("开始连接到远程服务器[%s][%ld]... ",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);
returnfalse;
}
//设为异步操作方式
unsignedlongon=1;
if(::ioctlsocket(m_socket,FIONBIO,&on)<0){
::closesocket(m_socket);
if(m_pCallBack)
m_pCallBack->OnSocketError(SE_CREATE,MSG_SE_CREATE);
returnfalse;
}
sockaddr_inaddr;
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);
intrt;
rt=::connect(m_socket,(sockaddr*)&addr,sizeof(addr));
if(rt==0){
OnConnected();
returntrue;
}
//==================================================================
timevalto;
//首先建立连接
fd_setwfds;
fd_setefds;
FD_ZERO(&wfds);
FD_ZERO(&efds);
//testshutdowneventeach100ms.
to.tv_sec=0;
//CONNECT_TIMEOUT;
to.tv_usec=100000;
intit=0;
while(!m_meShutdown.Wait(0)&&!m_meConnStop.Wait(0))
{
FD_SET(m_socket,&wfds);
FD_SET(m_socket,&efds);
intn=select(m_socket+1,NULL,&wfds,&efds,&to);
if(n>0){
if(FD_ISSET(m_socket,&wfds))
{
OnConnected();
returntrue;
}
else
{
//interr=::WSAGetLastError();
//constchar*msg=GetLastErrorMessage(err);
GNTRACE("CRemoteLink::Connect:connectionattemptfailed! ");
if(m_pCallBack)
m_pCallBack->OnSocketError(SE_CONN,MSG_SE_CONN);
break;
}
}elseif(n<0){//SelectError
interr=::WSAGetLastError();
constchar*msg=GetLastErrorMessage(err);
GNTRACE("CRemoteLink::Connect:SelectError.[%d]-%s ",err,msg);
if(m_pCallBack)
m_pCallBack->OnSocketError(err,msg);
break;
}
else
{
it+=100;
if(it>30000)//连接超时--(30S)
{
GNTRACE("CRemoteLink::Connect:Timeout. ");
if(m_pCallBack)
m_pCallBack->OnSocketError(SE_TIMEOUT,MSG_SE_TIMEOUT);
break;
}
}
}
if(m_meConnStop.Wait(0))
{
GNTRACE("连接过程进行时被取消。 ");
}
}
else
{
//通过代理服务器连接
C. Linux中TCP通信中 send函数 如何判断 何时断开连接了
1 确认链路是否连通状态,最好加心跳机制, 如果一定时间没有收到心跳包,或者没有回复心跳
就应认为此链路已经坏掉了,需要关闭,重新连接!
2 至于发送数据,应该检查对应的api的返回值,是否已经成功发送或者接受定长数据!
没有完成应该重新发送或者接受
3 网络数据问题,可以用抓包工具直接抓包看数据,可以看的比较透彻
工具 Linux下用tcpmp,windows用wirekshark
D. linux中tcp连接断开重莲时服务器应该怎么处理
断开重连,还是需要重新建立tcp三次握手,建立连接。
E. linux 操作系统 关闭非必要的TCP和UDP端口
Linux下面没有什么直接开启或者关闭端口的命令,因为若仅仅只是开启了端口而不把它与进程相联系的话,端口的开启与关闭就显得毫无意义了(开了端口却没有程序处理进来的数据)。也就是说,Linux里面端口的活动与进程是紧密相连的,如果想要关闭某个端口,那么只要杀掉它对应的进程就可以了。
例如要关闭22号端口:
$ netstat -anp | grep :22
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1666/sshd
# -a 显示所有活动的TCP连接,以及正在监听的TCP和UDP端口
# -n 以数字形式表示地址和端口号,不试图去解析其名称(number)
# -p 列出与端口监听或连接相关的进程(有个地方需要注意,下面会提到)(pid)
知道了22号端口对应的进程ID 1666,只要:
$ kill 1666
即可。
其中“-p”选项需要注意一个权限的问题,如果在普通用户登录的shell里面执行netstat命令,那么只能列出拥有该普通用户权限的相关进程,如果想要看到所有的端口情况,最好还是切到root。
附带几个netstat常用选项用法:
$ netstat -tn # 列出所有TCP协议的连接状态
# -t 只显示与TCP协议相关的连接和端口监听状态,注意和-a有区别(tcp)
$ netstat -tuln # 列出所有inet地址类的端口监听状态
F. 检查tcp 有没有断开 linux
client/server端recv:
①对端close(fd)检测(超时检测):recv 返回0,说明缓存区数据被读完,实测两种情况,对端没有再发数据,对端fd被关闭了。
通过select超时来检测,当超时如2s,我们认为对端连接断开,应关闭本地的fd。
②网线断开/断电关机检测(超时检测):recv 返回-1,errno == EAGAIN,意为“没有可读写数据,缓冲区无数据”。
所以此时需要select超时检测,若超时,要么对端没有再发数据,要么对端的网线断了或者直接断电了。
超过我们判定为对端不在线,关闭本地的fd。
G. linux tcp通信正常断开和异常断开分别该如何处理不用心跳机制
TCP 是面向连接的,自己有机制保证数据传输
TIMEOUT 不用自己去处理吧
H. linux在子进程中,client与server进行socket通信,客户端socket断开后不能与server连接,求高手指点
在不间断的建立连接过程中,每一次的连接断开会经过TCP状态的time_wait状态,这个状态的作用就是延迟一段时间,然后保证下一次连接的不会被当成上一次的连接。所以第二次的连接建立时如果没有经过一段时间第二次的连接会失败,报错会显示address in use这儿就是time_wait状态。你如果是在不同主机上进行不间断的连接肯定会出现上面的报错。
I. 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
{
// 通过代理服务器连接
J. 关于linux系统下TCP通信 服务器read函数一直读取数据却什么都读不到的问题
采用多线程编程,主进程负责等待连接到来,收到连接请求后父进程派生一个线程去处理该通信过程,通信处理交给该线程,父进程继续循环等待连接请求。通信结束,该线程结束。
当然也可以采用信号触发方式,当连接请求到来时,触发父进程派生一个线程去处理该请求。