socket编程,服务器断开,程序卡死在send函数 10C

请问大神们。下面的代码有什么问题的呢?为什么服务器断开。select超时是不跑的呢。谢谢!
int cflags = fcntl(pLink->iSocketFd,F_GETFL,0);
fcntl(pLink->iSocketFd,F_SETFL, cflags|O_NONBLOCK);
fd_set rds, wrs, exs;

FD_ZERO(&rds);     // 初始化  
FD_ZERO(&wrs);  
FD_ZERO(&exs);  

FD_SET(pLink->iSocketFd, &rds);    //设置socket句柄到select的FD参数中  
FD_SET(pLink->iSocketFd, &wrs);  
FD_SET(pLink->iSocketFd, &exs);  

struct timeval timeout;

if (pLink && 0 < pLink->iSocketFd)
{
    PC_SERVER_LOG("tcp send data start: addr:%s,port:%d\n", pLink->strRemoteAddr, pLink->iRemotePort);
    timeout.tv_sec  = 3;  
        timeout.tv_usec = 0;  
        PC_SERVER_LOG("lhw_mark pLink->iSocketFd = (%d)  line @@@@@\r\n", pLink->iSocketFd);
            int retSelect = select(pLink->iSocketFd, NULL, &wrs, NULL, &timeout);

            if ( retSelect == 0 ) {  
           PC_SERVER_LOG("lhw_mark select time out  429 line \r\n");
           return ET_AT_CMD_ERROR;

            } else if ( retSelect == -1) {  
            PC_SERVER_LOG("lhw_mark select Error  433 line \r\n");
            return ET_AT_CMD_SELECT_ERROR;
               // break;  
            } else {  
            PC_SERVER_LOG("lhw_mark select Total  437 line\r\n");
               // break;  
            }  

    while (0 < nRemain)
    {
        nSend = nRemain < 1024 ? nRemain : 1024;

        PC_SERVER_LOG("lhw_mark pLink->iSocketFd = (%d)  line @@@@@\r\n", pLink->iSocketFd);
        ret = send(pLink->iSocketFd, pSendPos, nSend, 0);
        if (-1 == ret)
        {
            PC_SERVER_LOG("lhw_mark error = (%d),error() @@@@@\r\n", errno);

            PC_SERVER_LOG("[et]link:(%d),send data   line\r\n", pLink->iLinkId);
            break;
        }
        PC_SERVER_LOG("lhw_mark 3333333 ret = (%d)  line @@@@@\r\n", ret);
        PC_SERVER_LOG("lhw_mark pLink->iSocketFd = (%d)  line @@@@@\r\n", pLink->iSocketFd);
        nRemain = nRemain - nSend;
        pSendPos = pSendPos + nSend;
        PC_SERVER_LOG("[et]link:%d,send %d\r\n", pLink->iLinkId, nSend);
        pLink->stDataFlow.nTxToSocket += nSend;
        pLink->stDataFlow.nTxAckSum += ret;
    }
}
0

3个回答

先看你的超时是否设置成功了,然后send确实是否没有返回。

0

超时是成功了,send也没返回值的。

0

怎么能看出超时是成功的呢?
int retSelect = select(pLink->iSocketFd, NULL, &wrs, NULL, &timeout);

        if ( retSelect == 0 ) {  
       PC_SERVER_LOG("lhw_mark select time out  429 line \r\n");
       return ET_AT_CMD_ERROR;

        } 
        这里一直没有打印信息的。
        谢谢!
0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
socket编程---send函数&recv函数详解
socket函数创建了一个socket fd,看一下socket fd的概念:套接字描述符是一个整数类型的值。每个进程的进程空间里都有一个套接字描述符表,该表中存放着套接字描述符和套接字数据结构的对应关系。该表中有一个字段存放新创建的套接字的描述符,另一个字段存放套接字数据结构的地址,因此根据套接字描述符就可以找到其对应的套接字数据结构。每个进程在自己的进程空间里都有一个套接字描述符表但是套接字数...
socket编程中应用recv判断连接已断开
在网络编程中,经常会检测网络的连接情况,进而进行下面的动作。在Linux的socket编程中,有一种非常方便的方法,来判断对方是否断开了连接,就是使用recv函数。在APUE 中,对 recv的表述如下,#include <sys/socket.h>nssize_t recv(int sockfd, void *buf, size_t nbytes, int flags);n 返回值:返回数据
socket在发送一段时间数据后send卡死问题的解决
近期在对新做的服务器做压力测试时,发现服务端在接收一阵子数据之后便不再响应,不能接收新的连接,也不能接收新的数据。并且服务端接收到的数据个数非常有规律,每次都基本固定。
tcp send 函数导致进程退出
1、在linux下写socket的程序的时候,如果尝试send到一个disconnected socket上,就会让底层抛出一个SIGPIPE信号。这个信号的缺省处理方法是退出进程。因此我的处理方法很简单,重新定义这个信号的处理方式,使用:nnvoid signal_func() { n}nnsignal(SIGPIPE,signal_func);nn这样程序就不会退出了nn2、在linux下se...
socket遇到错误直接退出原因和解决办法
原因:socket遇到错误时,默认将错误信息交给系统处理,而系统的处理办法一般是直接关闭整个应用,所以就会出现遇到错误程序直接关闭,比如客户端关闭,服务器还在给客户端发信息,就会出现发送失败,导致服务器也直接关闭的现象解决办法:把错误交给自己定义的函数处理 n先定义一个函数void Perr(int signum)n{n if(signum==SIGPIPE)n {n fpri
send 函数导致进程退出
本人之前没有做过网络方面的项目,对网络编程一知半解,最近写一个简单的网页遥控器程序,就是用网页绘制一个遥控器,然后点击遥控上的按钮,电视就会执行和真实遥控器相同的行为。于是写了一个简单的webserver,用C写的,写完后反复测试,发现服务器进程会莫名其妙的退出,很是诧异,通过加打印反复测试,发现问题出现在send函数上,可这是个函数出问题,我能怎办呀,愁死了。当然不可能是这个函数出问题了,这个函
send、recv等socket编程接口的阻塞与非阻塞模式.md
socket编程中经常使用send和recv函数来接收和发送数据。 n对于系统来说,不管是发送数据还是接收数据,都不是直接在内存上操作的。 发送数据有发送缓冲区,接收数据有接收缓冲区。对于send来说,send函数调用时,先将将应用程序请求发送的数据拷贝到发送缓存中,而后驱动程序会去读取发送缓冲中的数据,在进行真正的传输。 n对于recv来说,recv只是从接收缓冲中读取数据,而接收缓存中的数据来自
Linux系统网络编程中TCP通讯socket--send导致进程被关闭
send(sockfd, buff, sizeof(buff), 0); n在linuxTCP通讯中上述send形式是常用的设置方式,但是如果在TCP链接断开后调用该send函数,多次即会导致进程结束。解决方法 n最简单的方式就是 nsend(sockfd, buff, sizeof(buff), MSG_NOSIGNAL);下面说一下原因: linux下TCP/IP socket套接字建立后,
Socket send函数和recv函数详解
不论是客户还是服务器应用程序都用send函数来向TCP连接的另一端发送数据。
Python网络编程(socket编程)
Win10python - 3.5 Socket工作原理和基本概念       Socket的中文翻译是套接字,它是TCP/IP网络环境下应用程序与底层通信驱动程序之间运行的开发接口,它可以将应用程序与具体的TCP/IP隔离开来,使得应用程序不需要了解TCP/IP的具体细节,就能够实现数据传输。       在网络应用程序中,Socket通信是基于客户端/服务器结构。客户端是发送数据的一方。服务器...
在tcp半开连接(也就是死连接)上send数据, send函数会成功吗? 后续会怎样?
A, B两端tcp建立连接后, 如果中间的交换机断网、断电, 或者B端突然断电, 那么A是无感知的(不考虑心跳机制)。 有些书上喜欢把这种连接叫半开连接, 其实我更愿意叫它为死连接。 rn       此时, 如果A端send一些数据, 会怎样呢? 只要A端的发送内核缓冲区没有满(一般都没满), 那么send函数就是成功返回得, 很显然, 在B端是接收不到数据的。 这再次说明了, send函数和实
python的socket解决死锁的几个方法
缓冲流,程序输出和死锁标准流通常是可以缓冲的,输出的文本可能需要刷新,所以它在连接到某个进程的输出流时可以在套接字上显示。事实上,客户端需要显示或者隐式的刷新调用来正常工作;否则它们的输出是不完整的或者缺省的,直到程序退出为止,这种情况可能导致死锁—某个进程等待另一个进程永远不会输出的输出结果。在其他配置中,如果某个写入器退出较早,我们也可能得到某个读取器的套接字错误,尤其是在双向会话中。 n例如,
一些基本问题:大小端,网络字节序,socket编程函数的注意点,gdb和coredump调试
1,什么是大小端?大小端是指数据在内存的的存放顺序,现代计算机一次能够加载32bit或者64bit的数据或者指令,因而数据的存放顺序影响它被装载到整数的值。以小端来讲:低地址存数据的低位,高地址存数据的高;而大端敲好反过来:高地址存低位,地址存高位。2.测试大小端测试大小端最常用的方法是使用一个联合体,定义成员为一个short和char然后给short类型变量赋值为1,看char变量是否也是1,如...
python——socket编程
客户端/服务器架构 rn服务器就是一系列的硬件或软件,为一个或多个客户端提供所需的服务,它存在的唯一目的就是等待客户端的请求,并响应它们,然后等待更多的请求。 rn客户端/服务器网络编程 rn在服务器响应客户端请求之前,必须进行一些初步的设置流程来为之后的工作做准备。首先会创建一个通信端点,它能够使服务器监听请求。可以把服务器当作公司的前台,或者应答公司主线呼叫的总计接线员。一旦电话号码和设备安装成功且...
客户端断开socket连接, 服务端send 向一个失效的socket 发送数据,导致服务的进程退出
问题描述:nn客户端断开socket连接, 服务端send 向一个失效的socket 发送数据,导致服务的进程退出。nn原因分析:nn在linux下写socket的程序的时候,如果尝试send到一个disconnected socket上,就会让底层抛出一个SIGPIPE信号。n这个信号的缺省处理方法是退出进程,大多数时候这都不是我们期望的。因此我们需要重载这个信号的处理方法。nn解决方法可以有两...
异步socket编程中,send不出数据的原因总结和处理方案
异步socket编程中,send不出数据的原因共有两个,分别是:TCP下连接断开了和该socket处在阻塞状态(也就是说在发送数据中)。处理的办法是记录下该SOCKET的状态,当状态为阻塞的时间,放入缓冲,当该SOCKET再次可写时,发送。...
SecureCRT超时自动断开解决方案
解决方法可以通过两个入口进行设置: n1、右击Session中的连接,选择Properties->Terminal->Anti-idle->勾选Send protocol NO-OP。 n2、当已经建立连接的情况,可以通过上面方法,另外也可以通过点击Options->Session Options->Terminal->Anti-idle->勾选Send protocol NO-OP选中之后,后面显
c++ socket编程中accept阻塞问题
在用c++编写socket代码时,出现了,accept不阻塞的问题,感觉很是苦恼,一直查找问题,发现代码时没有问题的。最终发现把#include <thread> n#include <mutex>屏蔽掉可以解决,当时就在想为什么出现这种情况呢,后来,在大神的指点下,发现,这是因为在使用using namespace std;出现的错误,所以希望大家尽量不要使用using namespace st
socket编程设置send和recv的超时时间(windows)
int recvTimeout = 30 * 1000; //30snint sendTimeout = 30 * 1000; //30snnsetsockopt(connSocket, SOL_SOCKET, SO_RCVTIMEO, (char *)&amp;amp;recvTimeout, sizeof(int));nsetsockopt(connSocket, SOL_SOCKET, SO_S...
C++ Socket编程(二) send与recv 缓冲区与阻塞
socket缓冲区每一个socket在被创建之后,系统都会给它分配两个缓冲区,即输入缓冲区和输出缓冲区。 n send函数并不是直接将数据传输到网络中,而是负责将数据写入输出缓冲区,数据从输出缓冲区发送到目标主机是由TCP协议完成的。数据写入到输出缓冲区之后,send函数就可以返回了,数据是否发送出去,是否发送成功,何时到达目标主机,都不由它负责了,而是由协议负责。recv函数也是一样的,它并不是直
linux socket tcp server 解决客户端socket断开后, 服务器端进程退出的问题
当服务器监听并接受一个客户端链接的时候, 可以不断向客户端发送数据, 这时如果客户端断开socket链接, 服务器继续向一个关闭的socket 发送数据(send, write)的时候, 系统会默认对服务器进程发送一个SIGPIPE信号, 这个信号的默认动作就是终止当前服务器进程.rn所以为了解决客户端断开后导致服务器进程结束的问题, 使用如下方法忽略SIGPIPE信号.rnstruct siga
简单的UDP网络程序(Socket API)
预备知识:nnn本文的目的是写回显服务器,在撸代码之前,先来个热身。nnnIP地址是什么?nnIP地址有IPV4、IPV6之分,一般不特俗说明,默认就是IPV4。nnn IP地址是用来标识不同的主机,每个主机都有唯一的IP地址; n 对于IP4来说,IP地址是一个4字节,32位整数; n IP地址用“点分”制表示,如:192.168.1.11(用点分割的每个数范围0~255)。nnn源IP地...
wensocket总连接断开的问题
Error reading request, ignored njava.lang.IllegalStateException: A text message handler has already been configured n at org.apache.tomcat.websocket.WsSession.addMessageHandler(WsSession.java:187) ...
linux 套接字函数send和recv函数(阻塞模式)
send函数的流程:nbuffer的内容 —->linuxTCP协议栈发送缓存区—->内核发送n什么情况下,buffer内容才会先写入协议缓存区呢 ,协议缓存区有一个SO_SNDLOWAT最低位标志,表示缓存区有空间了, 一般是2048字节。就是说缓存区至少2048字节剩余空间,你才能继续向缓存区写。selcet /epoll等监视内核,就是依据这个,判断socket是否可以向缓存区写数据,就是产生
python下socket编程之TCP连接状态
1. 引言nnpython作为一门胶水语言,可以在各个领域上作为快速开发的工具,大大提高开发者处理事务的效率。在互联网行业中,不管是对网络服务器的开发,还是对网络客户端,例如爬虫的开发中,都会涉及到底层的运行原理,那就是socket编程,那么今天,我们将对python下的socket编程开发中,TCP协议中连接状态做一个介绍,通过本篇文章,可以让大家对网络编程中底层的TCP协议的连接有一定的认识。...
linux内核中tcp连接的断开处理
我们这次主要来分析相关的两个断开函数close和shotdown以及相关的套接口选项SO_LINGER。这里要注意SO_LINGER对shutdown无任何影响。它只对close起作用。rnrn先来坎SO_LINGER所对应的数据结构:rnrn[code=&quot;java&quot;]struct linger {rn///linger的开关rn int l_onoff; /* Linger active *...
Java Socket编程(一) Socket编程原理及基本概念
介绍了Socket编程的基本概念,并以UDP编程为例,给出示例。
Unix网络编程之读写操作recv和send函数
函数原型n#include nssize_t recv(int sockfd, void *buff, size_t nbytes, int flags);nssize_t send(int sockfd, const void *buff, size_t nbytes, int flags);n参数说明:nsockfd—表示一个打开的套接口描述字nbuff—表示发送或者接受数据的缓冲
另一种实现非阻塞网络通信的方法———使用libev
背景:最近终于开始了我的实习生之路,本来在进公司之前还比较紧张,尽管拿到了offer,因为毕竟这是一个新的起点,一开始从学生到员工这个身份的转变让我有些不太适应,但是还好在公司里遇到了人超级好的软件经理Alex以及其他精明能干的小伙伴们,所以这个过渡时间也很快。rn一开始Alex让我通过公司的一个项目了解libev这个库,我在看同事写的代码的过程中遇到的问题实在太多,由于我之前写的和这个项目类似的
网络编程(基于winsocket)-- 常用函数介绍(一)
本文主要记录网络编程中经常用到的函数,作为学习的笔记
C++ TCP socket编程中的小陷阱(服务端accept 不阻塞 和 客户端connect 重连失败)
在编写一个使用C++ socket实现的TCP服务端与客户端小软件时接连碰上2个小陷阱,nn终归是实践不足,基本功不扎实。nn nn第1个问题: 服务端的accept函数没有阻塞nn    程序运行到accept这里时直接就跳了过去,根本没停下来。nn    怀疑过socket的配置是否有错误,经过各种调试,当把socket部分的代码从工程中截取出,单独放到一个空白工程中运行时,一切又都正常了。n...
客户端与服务器进行通信时sendto()和recfrom()函数的工作原理
客户端与服务器进行通信时sendto()和recfrom()函数的工作原理:注意基于UDP协议进行传输时,是这两个函数。当进程间通讯是基于TCP时,就是send()和recv()函数。但两者工作原理都一样。rn我们知道32位机器运行一个进程,操作系统会有4GB虚拟地址空间,其中2GB分配给内核,2GB分配给用户。当然了,并不是2GB资源都分配给该进程,而是进程需要多少就会分配多少。rnrn电脑A中
阿里云服务器ssh连接,客户端一段时间没响应就断掉的解决办法
1.打开配置文件nvim /etc/ssh/sshd_confignn2.找到下面两行n#ClientAliveInterval 0n#ClientAliveCountMax 3nn去掉注释,并修改nClientAliveInterval 30 //客户端每隔多少秒向服务发送一个心跳数据nClientAliveCountMax 86400 //客户端多少秒没有相应,服务器自动断掉连接nn3.重启s...
关于Socket通信中的read和write
[size=medium][size=small]read()方法需要3个参数:1)接收数据的字节数组,2)接收的第一个字节应该放入数组的位置,即字节偏移量,3)放入数组的最大字节数。read()方法在没有可读数据时会阻塞等待,直到有新的数据可读,然后读取指定的最大字节数,并返回实际放入数组的字节数(可能少于指定的最大字节数)。循环只是简单地将数据填入data字节数组,直到接收的字节数与发送的字节...
解决Linux下网络编程(sendto send )出现 SIGPIPE 信号导致程序异常终止的问题
引言n最近在Linux下网络编程时,出现SIGPIPE 信号导致程序异常终止,本文记录下解决的方法以及相应的知识。nSIGPIPE 信号资料n什么时候出现此信号,APUE中有关此信号的解释如下:nnLinux man手册有关此信号的解释:nman 7 signal nSIGPIPE 13 Term Broken pipe: write to pipe with no r...
socket编程(一),实现服务器与客户端简单通信
本节主讲客户端向服务发送信息,服务器转发给客户端,当然也可以稍微改一下代码可以实现互传消息,不再赘述。 n难点在于服务器端的代码思路: n(1)主程序Socket socket=server.accept();等待客户端连接。 n(2)创建线程函数,实现连接成功后创建一个新的线程,服务器转发客户端消息。 nTCPServer.javapackage com.ysu.server.chatroom;i
Tcp/Ip编程socket相关函数
socket的基本操作:n(1)socket()函数:n(2)bind()函数:n(3)listen(),connect()函数;n(4)accept()函数;n(5)socket中的发送与接收函数:n(6)close()函数:n(7)服务器上调用socket函数:n(8)客户端调用socket函数:n(9)IP地址转换函数:inet_pton, inet_ntop, inet_addr:nn n...
android下socket编程问题:服务器关闭时,客户端发送请求的异常处理
我用socket分别创建了一个服务器和一个客户端。rr当服务器程序运行时,客户端和服务器发送接收数据是OK的。rr但是,如果服务器程序关闭以后,客户端仍然发送请求的话,会抛出一个IOException。但这个时间间隔很久,要三到四分钟才会抛出这个异常的。刚开始还以为是死机了呢!rr我想在客户端做一个处理:如果服务器未开,要弹出一个提示框,然后结束当前程序。r请问怎么实现?rr附创建客户端的部分代码
关于客户端断开连接后服务器抛出异常Connection reset
学习了socket  ,在做一个类似qq的c/s结构的聊天软件。发现了一个问题rn就是在客户端与服务器通信后,服务器为客户端开启一个线程,使用while(true)循环时刻监听是否有通信。rn在界面开启时没有任何异常,可是当界面关闭 就一直抛出异常了。rn开启线程代码如下:rnrnrn异常内容如下:rnrnjava.net.SocketException: Connection resetrnat
Python下UDP的Socket编程:服务器端因客户端的非正常退出而报错?
服务器端代码nnnnimport socketnimport threadingnimport loggingnimport datetimennlogging.basicConfig(format='%(message)s', level=logging.INFO)nnnclass ChatUdpServer:n def __init__(self, ip='127.0.0.1', por...
文章热词 统计学稳健估计opencv函数 机器学习教程 Objective-C培训 交互设计视频教程 颜色模型
相关热词 mysql关联查询两次本表 native底部 react extjs glyph 图标 学习大数据电脑卡死 区块链的服务器