导航:首页 > 编程系统 > linuxclienttcp断开

linuxclienttcp断开

发布时间:2021-12-09 06:50:14

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抓 一抓包啥东西都清清楚楚

Ⅱ 如何判断TcpClient已断开连接

Socket在连接以后,如果客户端非正常退出,比如网线掉了、超时退出等,服务器端的socket仍然有缓存,此时可以从该socket描述符中读出一些数据,短时间内甚至可以写,因此判断TCP socket是否断开及其不易,网上有很多方法,都不能精确判断。本人用select和recv写了一个,在缓冲区被读完以后判断非常管用。这里,recv时使用MSG_PEEK参数,数据不会从缓冲区中清除掉,因此不会影响正常的读写。 /* check whether socket is connected. Actually, it is not accurate if the client * crashs and the server don't know about it because the socket buffer is ready. * So the return value '0' doesn't mean the socket is really valid. Of course, * '-1' shows the socket is invalid*/int checksock(int s){fd_set fds; char buf[2]; int nbread; FD_ZERO(&fds); FD_SET(s,&fds); if ( select(s+1, &fds, (fd_set *)0, (fd_set *)0, NULL) == -1 ) { //log(LOG_ERR,"select(): %s\n",strerror(errno)) ;return -1;}if (!FD_ISSET(s,&fds)) { //log(LOG_ERR,"select() returns OK but FD_ISSET not\n") ;return -1;}/* read one byte from socket */

Ⅲ TcpClient为什么自动断开

我曾经遇到了而且现在又遇到了呵呵

恩如果你的服务器端使用线程来处理与客户端的通信的话,很可能是一次发送数据结束而导致线程结束,于是“远程主机强迫关闭。。。”,试试在服务器端传输完使用代码来(close)TcpClient或NetworkStream;
如果不让断开,就在关闭程序之前一直用一个while循环取数据(同步方式),或者使用BeginRead 、EndRead循环调用取数据(异步方式)

Ⅳ 如何在TCP Server端解决出现断网/断电后,让Client端断开连接

recv 函数收到的数据长度为0,表示对方主动断开了连接
recv 函数收到的数据长度为0,表示对方主动断开了连接

Ⅳ linux tcp通信正常断开和异常断开分别该如何处理不用心跳机制

TCP 是面向连接的,自己有机制保证数据传输
TIMEOUT 不用自己去处理吧

Ⅵ linux中tcp连接断开重莲时服务器应该怎么处理

断开重连,还是需要重新建立tcp三次握手,建立连接。

Ⅶ linux在子进程中,client与server进行socket通信,客户端socket断开后不能与server连接,求高手指点

在不间断的建立连接过程中,每一次的连接断开会经过TCP状态的time_wait状态,这个状态的作用就是版延迟一段时间,然后保证下权一次连接的不会被当成上一次的连接。所以第二次的连接建立时如果没有经过一段时间第二次的连接会失败,报错会显示address in use这儿就是time_wait状态。你如果是在不同主机上进行不间断的连接肯定会出现上面的报错。

Ⅷ linux socket怎么检测断开

我想通过recv和send的返回值来判断是否连接异常,但是不成功,下面是我的测试代码,连接成功后如果我断开客户端,那么服务端不会打印错误信息而是等待几秒后直接终止;如果断开服务端,客户端的recv不再阻塞,而且返回值一直是0,请高手指点。

C/C++ code//服务端
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/wait.h>
#define MYPORT 3490 /*定义用户连接端口*/
#define BACKLOG 10 /*多少等待连接控制*/
int main(int argc, char *argv[])
{
int sockfd, new_fd;/* listen on sock_fd, new connection on new_fd*/
struct sockaddr_in my_addr; /* my address information */
struct sockaddr_in their_addr; /* connector's address information */
int sin_size;
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
perror("socket");
exit(1);
}

int opt = 1;
int len = sizeof(opt);
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &opt, len);

my_addr.sin_family = AF_INET; /* host byte order */
my_addr.sin_port = htons(MYPORT); /* short, network byte order */
my_addr.sin_addr.s_addr = INADDR_ANY; /* auto-fill with my IP */
bzero(&(my_addr.sin_zero),0); /* zero the rest of the struct */

if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr))== -1)
{
perror("bind");
exit(1);
}
if (listen(sockfd, BACKLOG) == -1) {
perror("listen");
exit(1);
}

while(1) { /* main accept() loop */
sin_size = sizeof(struct sockaddr_in);
printf("while\n");
if ((new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size)) == -1)
{
perror("accept");
continue;
}
printf("server: got connection from %s\n", inet_ntoa(their_addr.sin_addr));

while(1)
{
usleep(10000000);
if (send(new_fd, "Hello, world!\n", 14, 0) == -1)
perror("send");
}
close(new_fd);
exit(0);

}
return 0;
}

C/C++ code//客户端
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <netdb.h>
#define PORT 3490 /* 客户机连接远程主机的端口 */
#define MAXDATASIZE 100 /* 每次可以接收的最大字节 */
int main(int argc, char *argv[])
{
int sockfd, numbytes;
char buf[MAXDATASIZE];
struct hostent *he;
struct sockaddr_in their_addr; /* connector's address information */
if (argc != 2)
{
fprintf(stderr,"usage: client hostname\n");
exit(1);
}
if ((he=gethostbyname(argv[1])) == NULL)
{ /* get the host info */
herror("gethostbyname");
exit(1);
}

if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
perror("socket");
exit(1);
}

their_addr.sin_family = AF_INET; /* host byte order */
their_addr.sin_port = htons(PORT); /* short, network byte order */
their_addr.sin_addr = *((struct in_addr *)(he->h_addr));
bzero(&(their_addr.sin_zero),0); /* zero the rest of the struct */
if (connect(sockfd, (struct sockaddr *)&their_addr,sizeof(struct sockaddr)) == -1)
{
perror("connect");
exit(1);
}
while(1)
{
printf("receiving......\n");
if ((numbytes=recv(sockfd, buf, MAXDATASIZE, 0)) == -1)
{
perror("recv");
exit(1);
}
buf[numbytes] = '\0';
printf("Received: %s\n",buf);
}
close(sockfd);
return 0;
}

另外,在网上看到一种利用TCP协议栈中的KeepAlive探测的方法,下面是我从网上找的用的比较多的一段代码,这里应该只是设置了一些属性参数,但不知具体怎样在通信中检测断开,请高手赐教。
C/C++ code#include
……
////KeepAlive实现
//下面代码要求有ACE,如果没有包含ACE,则请把用到的ACE函数改成linux相应的接口
int keepAlive = 1;//设定KeepAlive
int keepIdle = 5;//开始首次KeepAlive探测前的TCP空闭时间
int keepInterval = 5;//两次KeepAlive探测间的时间间隔
int keepCount = 3;//判定断开前的KeepAlive探测次数

if(setsockopt(s,SOL_SOCKET,SO_KEEPALIVE,(void*)&keepAlive,sizeof(keepAlive)) == -1)
{
ACE_DEBUG ((LM_INFO,
ACE_TEXT ("(%P|%t) setsockopt SO_KEEPALIVE error!\n")));

}

if(setsockopt(s,SOL_TCP,TCP_KEEPIDLE,(void *)&keepIdle,sizeof(keepIdle)) == -1)
{
ACE_DEBUG ((LM_INFO,
ACE_TEXT ("(%P|%t) setsockopt TCP_KEEPIDLE error!\n")));
}

if(setsockopt(s,SOL_TCP,TCP_KEEPINTVL,(void *)&keepInterval,sizeof(keepInterval)) == -1)
{
ACE_DEBUG ((LM_INFO,
ACE_TEXT ("(%P|%t) setsockopt TCP_KEEPINTVL error!\n")));
}

if(setsockopt(s,SOL_TCP,TCP_KEEPCNT,(void *)&keepCount,sizeof(keepCount)) == -1)
{
ACE_DEBUG ((LM_INFO,
ACE_TEXT ("(%P|%t)setsockopt TCP_KEEPCNT error!\n")));
}

Ⅸ 服务器端与客户端建立了TCP连接, 但是 Client 并没有close, server端会主动断掉TCP连接么

看服务器端的设置

Ⅹ 检查tcp 有没有断开 linux

client/server端recv:
①对端close(fd)检测(超时检测):recv 返回0,说明缓存区数据被读完,实测两种情况,对端没有再发数据,对端fd被关闭了。
通过select超时来检测,当超时如2s,我们认为对端连接断开,应关闭本地的fd。
②网线断开/断电关机检测(超时检测):recv 返回-1,errno == EAGAIN,意为“没有可读写数据,缓冲区无数据”。
所以此时需要select超时检测,若超时,要么对端没有再发数据,要么对端的网线断了或者直接断电了。
超过我们判定为对端不在线,关闭本地的fd。

阅读全文

与linuxclienttcp断开相关的资料

热点内容
小说女主被男主囚禁生娃 浏览:42
韩剧19禁电影 浏览:316
蝉妈妈直播数据为什么不准 浏览:897
梅花档案好看吗 浏览:420
win10系统怎么调低亮度 浏览:345
火影忍者小说主角是女的 浏览:406
韩国电影我的变态邻居女演员是谁 浏览:79
电影枪版在哪看 浏览:796
视频区小说区图片区 浏览:784
一个男的和一个骑自行车的女人外国电影 浏览:152
有什么好看3a的电影网址么 浏览:565
电脑不能压缩文件什么情况 浏览:726
华为双用户密码忘记 浏览:315
红羊电影在线观看 浏览:115
功夫2电影粤语 浏览:311
linux如何删除压缩包 浏览:337
宋丹丹第一部电影 浏览:996
动漫爱情电影推荐日本 浏览:530
小说兄妹禁忌恋 浏览:292
哥哥123.ggbb07. 浏览:687

友情链接