socket通信accept语句执行太长(几百毫秒),会丢失数据怎么解决?

问题描述

socket通信accept语句执行太长(几百毫秒),会丢失数据怎么解决?

WSADATA data; //定义WSADATA结构体对象
WORD w = MAKEWORD(2, 0); //定义版本号码
::WSAStartup(w, &data); //初始化套接字库
SOCKET s, s1;
//定义连接套接字和数据收发套接字句柄

s = ::socket(AF_INET, SOCK_STREAM, 0);      //创建TCP套接字
sockaddr_in addr, addr2;                    //定义套接字地址结构
addr.sin_family = AF_INET;              //初始化地址结构
addr.sin_port = htons(6000);
addr.sin_addr.S_un.S_addr = INADDR_ANY;
int n = sizeof(addr2);

/*connect(s, (sockaddr*)&addr, sizeof(addr));*/

int tt = clock();
bind(s, (sockaddr*)&addr, sizeof(addr));
listen(s, 2);
//s1 = accept(s, (sockaddr*)&addr2, &n);

while (true)
{
    int t1 = clock();
    s1 = accept(s, (sockaddr*)&addr2, &n);//该语句时间很长
    int tt = clock();
    int time = tt - t1;
    char sztext[1000] = { 0 };

    recv(s1, sztext, sizeof(sztext), 0);

if (s1 == INVALID_SOCKET)
{
    AfxMessageBox(_T("通信故障"));
    break;
}
}

解决方案

这个accept取决于你的客户端请求,有客户端请求了,才会accept,不然就阻塞在那

时间: 2024-11-02 05:18:14

socket通信accept语句执行太长(几百毫秒),会丢失数据怎么解决?的相关文章

socket通信-Socket通信 服务端还没有write完,客户端开始读取数据

问题描述 Socket通信 服务端还没有write完,客户端开始读取数据 Socket通信 服务端还没有write完,客户端开始读取数据,出现数据不完整的现象,如何保证客户端读取的数据完整性,切服务端发送一条客户端可以读取一条 解决方案 tcp连接等.

求教:在C#中执行游标语句时间太长超时,如何解决

问题描述 大概要执行200个循环,执行时间大概是五分钟左右.在页面里执行总是报时间超时.这个应该如何优化,或者说页面发个命令直接后台执行下面这段语句也可以代码见下:DECLARE@FCUSRNUMBERvarchar(50)DECLARE@FDATEVARCHAR(20)SET@FDATE=CONVERT(varchar(20),DATEADD(MM,-1,GETDATE()),23)DECLAREMy_CursorCURSOR--定义游标FOR(selectdistinctFNUMBERfro

用C#执行SQL语句时,由于有些语句执行时间太长,在执行某一条的过程中,需要对该条语句进行标红,问怎么判断一条SQL语句正在执行中呢???

问题描述 急急急球大神指点!!!! 解决方案 解决方案二:需要对该条语句进行标红是啥意思?解决方案三:你看看这样行不行://这里执行对某行SQL语句文本设置为红色.stringinsertcommand=string.Format(@"insertintoGateChangeInfo(OldValue,NewValue,LastUpdateTime)values('{0}','{1}',{2})",TheOldGateNo.Trim(),textBox_Gate.Text.Trim()

mysql-使用navicat premium打开oracle数据表时提示“内部缓冲区字符太长”

问题描述 使用navicat premium打开oracle数据表时提示"内部缓冲区字符太长" 使用navicat premium打开oracle数据表时提示"内部缓冲区字符太长",但在plsql里面是正常的: 使用navicat premium"数据传输"功能将oracle数据表导入到mysql时,oracle中number类型在mysql中默认为保留小数点后30位..怎样才能设置成不保留小数点呢不知道是怎么回事,求大神指教~~ 解决方案 直接

Java Web项目中使用Socket通信多线程、长连接的方法_java

很多时候在javaweb项目中我们需要用到Socket通信来实现功能,在web中使用Socket我们需要建立一个监听程序,在程序启动时,启动socket监听.我们的应用场景是在java项目中,需要外接如一个硬件设备,通过tcp通信,获取设备传上来的数据,并对数据做回应. 先看一下web的监听代码: import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; public class

请问C#中的socket通信服务器端accept函数的使用时机

问题描述 c#的socket编程服务器端一般遵循1.创建socket实例2.bind3.listen4.accept等待客户端链接5.receive/send....等等步骤问题如下:1.请问accept等待链接我看到很多实例是在Form_Load中调用了一次,我在想,只调用了一次如果客户端关掉重新启动,服务器端会不会建立新的客户端链接2.在msdn帮助中说accept函数在链接时会返回一个socket类型的实例,那么在没有客户端和他链接呢,是什么情况?返回一个空的socket实例吗?3.一般如

byte-C#中socket通信需要将数据按包头和定长分割,如何做

问题描述 C#中socket通信需要将数据按包头和定长分割,如何做 包头是0x55,每个数据加上包头为11个byte,但是数据中也可能出现0x55,该如何分割 解决方案 一般的解决方法是两种: 1)定义转义符,对内容中的 0x55 进行转义.如将 0x55 转义成 0x54 01;则 0x54 是 0x54 00:用两个字节表示: 2)定义包头后带数据的长度,再加上包尾,最好再加上一个校验位.这样在接收到一包数据后,先按上述定义进行有效性验证. 解决方案二: 包头后面带上长度信息,按长度去截取啊

跑批文件执行异常,页面闪退,显示输入行太长

问题描述 跑批文件执行异常,页面闪退,显示输入行太长 @rem "=批量=" @if "%DEBUG%" == "" @echo off @if "%JAVA_HOME%" == "" go JAVAHOME set CMSLIB=C:batchlib set classpath=C:batchlib;C:batchclasses set CLASSPATH==%classpath%;c:batchlibl

socket-安卓 Socket通信,Socket连接不上,程序就在真机崩溃但在模拟器上正常

问题描述 安卓 Socket通信,Socket连接不上,程序就在真机崩溃但在模拟器上正常 class ReceiveData extends Thread { int i=1; private void reconnect( ) { Log.i("第"+i+"次连接","reconnect刚开始执行"); try { Log.i("第"+i+"次连接","Socket之前"); Sock