首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Indy10 TCP服务器冻结

Indy10 TCP服务器冻结
EN

Stack Overflow用户
提问于 2013-02-08 12:26:54
回答 1查看 1.1K关注 0票数 0

我使用Indy与C++ Builder XE3。这是一个完美的系统,但我有一些问题。IdTCPServer运行得很好,但是当我在他身上有一些连接,并且我想要停止服务器时,我的应用程序就会冻结。我试着一步一步地讲述我是如何做到的: 1)启动应用程序(和服务器侦听) 2)等待新连接(或模拟它,没有区别) 3)当我们有10-15个连接时,然后尝试停止服务器侦听。4)当代码到达IdTCPServer1 1->Active= false时,应用程序将被冻结。

我拍了一些视频。也许它能更好地解释情况。http://www.youtube.com/watch?v=BNgTxYbLx8g

在这里,我的代码:

OnConnect:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
EnterCriticalSection(&CritLock);
++ActiveConnections;
SetActiveConnections(ActiveConnections);
LeaveCriticalSection(&CritLock);

OnDisconnect:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
EnterCriticalSection(&CritLock);
--ActiveConnections;
SetActiveConnections(ActiveConnections);
LeaveCriticalSection(&CritLock);

StopServer代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void TForm1::StopServer()
{
    TList *list = IdTCPServer1->Contexts->LockList();
    try
    {
        for(int i = 0; i < list->Count; ++i)
        {
            TIdContext *AContext = reinterpret_cast<TIdContext*>(list->Items[i]);
            try
            {
                if (AContext->Connection->Connected())
                {
                    AContext->Connection->IOHandler->InputBuffer->Clear();
                    AContext->Connection->IOHandler->WriteBufferCancel();
                    AContext->Connection->IOHandler->WriteBufferClear();
                    AContext->Connection->IOHandler->WriteBufferClose();
                    AContext->Connection->IOHandler->CloseGracefully();
                    AContext->Connection->Disconnect();
                }
            }
            catch (const Exception &e)
            {

            }
        }
    }
    __finally
    {
        IdTCPServer1->Contexts->UnlockList();
    }
    IdTCPServer1->Contexts->Clear();
    //IdTCPServer1->StopListening();
    IdTCPServer1->Active = false;
}

谢谢你的建议!

EN

回答 1

Stack Overflow用户

发布于 2013-02-08 12:48:17

除了最后一行之外,您需要删除所有的StopServer()代码。当TIdTCPServer被停用时,它会为您执行所有必要的清理。不要自己做(特别是因为你做错了)。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void TForm1::StopServer()
{
    IdTCPServer1->Active = false;
}

现在,只要有了这些代码,如果你的应用程序还在冻结,那就意味着你的主线程是死锁的。如果在主线程的上下文中调用StopServer(),并且服务器代码中有两种情况之一,则会发生这种情况:

  1. 您的TIdTCPServer事件处理程序之一对主线程执行同步操作(通过TIdSyncTThread::Synchronize())。
  2. 您的TIdTCPServer事件处理程序之一吞噬了Indy异常,并且不允许TIdTCPServer在需要时正确终止一个或多个客户端线程。

在内部,TIdTCPServer::Active属性设置程序关闭所有活动的套接字并等待它们各自的线程完全终止,阻塞调用线程直到属性集退出。如果yoou在主线程中使服务器失活,而其中一个服务器线程执行主线程不能处理的同步,或者在应该时不正确终止同步,则将阻止服务器失活,从而导致主线程死锁。

所以要确保:

  1. 当服务器被主线程停用时,您不会对主线程执行同步操作。如果必须同步,则在工作线程中禁用服务器,以使主线程不再被阻塞。
  2. 您的事件处理程序不会在EIdException块中吞咽任何Indy -derived异常。如果你捕捉到这样的异常,当你发现使用它时,重新抛出它。让TIdTCPServer处理任何Indy异常,这样它就可以根据需要执行内部清理。

最后,附带说明,您不需要手动跟踪连接。TIdTCPServer已经在Contexts属性中为您执行了此操作。如果您需要知道当前有多少客户机在任何时候连接,只需Lock() Contexts列表,读取其Count属性(或对客户端执行其他需要做的任何事情),然后对列表进行Unlock()

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14780792

复制
相关文章
进程冻结
进程冻结技术(freezing of tasks)是指在系统hibernate或者suspend的时候,将用户进程和部分内核线程置于“可控”的暂停状态。
233333
2023/03/08
1.2K0
进程冻结
冻结计划
大多数SQL语句都有一个关联的查询计划。查询计划是在准备SQL语句时创建的。默认情况下,添加索引和重新编译类等操作会清除此查询计划。下次调用查询时,将重新准备查询并创建新的查询计划。冻结计划使可以跨编译保留(冻结)现有查询计划。查询执行使用冻结的计划,而不是执行新的优化并生成新的查询计划。
用户7741497
2022/06/08
1.9K0
账户冻结说明
开通按量计费(后付费)资源时,会冻结您账户上的部分资金(余额小于冻结费用则无法开通);在您主动释放资源或由于您账户欠费导致资源释放后会解冻该部分资金;冻结的金额没有实际消耗,在冻结状态下无法使用,解冻后恢复使用。
☆~oo~☆
2022/09/21
1.8K0
ETH被冻结_微信冻结显示什么界面
如果我们的电脑在启动挖矿软件的时候,发现界面有停顿,Miner都会冻结。有时矿工会随机冻结,直到按下任何键。
全栈程序员站长
2022/11/04
1.3K0
ETH被冻结_微信冻结显示什么界面
IOCP模型TCP服务器
主线程创建监听套接字,创建额外工作线程,关联IOCP,负责等待和接受到来的连接。 调用GetQueuedCompletionStatus函数,函数返回: 1 调用失败 2 套接字被对方关闭 3 请求成功完成 程序首先定义per-handle per-IO的操作数据的结构类型 #define BUFFER_SIZE 1024 typedef struct _PER_HANDLE_DATA{ SOCKET s; sockaddr_in addr; }PER_HANDLE_DATA,*PPER_H
用户1154259
2018/01/17
1.8K0
多线程TCP服务器
本文讲述了一个基于Java实现的TCP服务器和客户端的示例,通过多线程实现每连接发送一个图片,并提供了传输速度的提示。服务器端采用ServerSocket类实现,而客户端采用Socket类实现。客户端连接到服务器后,服务器会启动一个新的线程来处理每个客户端连接,客户端则在每个连接中发送一个图像文件。服务器端在处理每个连接时,读取文件并发送回客户端。传输速度提示通过在服务器端启动一个单独的线程来处理所有连接来实现。总体而言,该示例提供了一个简单的TCP通信框架,可以在基于Java的应用程序中使用。
GavinZhou
2018/01/02
1.7K0
多线程TCP服务器
php实现tcp服务器
经过了一个半月的研究,终于将php多进程,和tcp方面研究通了,这篇文章主要讲解一下我了解到的知识点
仙士可
2019/12/19
3.1K0
php实现tcp服务器
swoole创建tcp服务器tcp server使用telnet连接自定义 tcp client
tcp服务官方文档 swoole tcp tcp server <?php /** * Class Tcp * Tcp服务 */ class Tcp { CONST HOST = "0
章鱼喵
2018/06/27
2.3K0
Netty搭建TCP服务器实践
在netty基本组件介绍中,我们大致了解了netty的一些基本组件,今天我们来搭建一个基于netty的Tcp服务端程序,通过代码来了解和熟悉这些组件的功能和使用方法。
星哥玩云
2022/07/24
2K0
Go Web---tcp服务器
这部分我们将使用 TCP 协议和之前讲到的协程范式编写一个简单的客户端-服务器应用,一个(web)服务器应用需要响应众多客户端的并发请求:Go 会为每一个客户端产生一个协程用来处理请求。我们需要使用 net 包中网络通信的功能。它包含了处理 TCP/IP 以及 UDP 协议、域名解析等方法。
大忽悠爱学习
2022/08/23
1.7K0
Go Web---tcp服务器
TCP客户机-服务器
1 僵尸进程 2 信号处理 信号: 1 由一进程发往另一进程 2 由内核发往某进程 僵尸状态: 父进程取回子进程的相关信息,进程的ID,终止状态,子进程的资源利用信息 编程时: 1 当派生子进程时,必须捕获信号SIGCHLD 2 当捕获信号时,必须处理被中断的系统调用 3 SIGCHLD的信号处理程序必须正确编写,使用函数waitpid以免留下僵尸进程 1 int main(int argc,char **argv){ 2 int listenfd,connfd; 3 pid_t childpid;
用户1154259
2018/01/17
1.9K0
socket---TCP服务器界面
#include<winsock2.h> #pragma comment(lib,"ws2_32.lib") #define DEFAULT_iPort 5000 LRESULT CALLBACK DialProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInstance, LPSTR lpCmdLine, int nCmdShow) { DialogBox(hInstance,(LPCSTR)IDD_FORMVIEW, NULL,(DLGPROC)DialProc); return 0; } LRESULT CALLBACK DialProc(HWND hDIg, UINT uID, WPARAM wParam, LPARAM lParam) {             char ip[16]; char port[5];//端口号 char recvBuf[1000];//缓存区大小 char sendBuf[1000]; SOCKET sListen, sAccept; SOCKADDR_IN ser, cli; int iLen = sizeof(cli); sListen = socket(AF_INET, SOCK_STREAM,0); sAccept= socket(AF_INET, SOCK_STREAM,0); switch (uID) { case WM_COMMAND://对话框消息 switch(wParam) { case IDC_IPSTART: {    GetDlgItemText(hDIg, IDC_IP,ip, 16); GetDlgItemText(hDIg, IDC_PORT,port, 16); ser.sin_family = AF_INET; ser.sin_addr.s_addr = inet_addr(ip); ser.sin_port = htons(atoi(port)); bind(sListen, (sockaddr *)&ser, sizeof(ser)); listen(sListen, 5); sAccept = accept(sListen, (sockaddr *)&cli, &iLen); if (INVALID_SOCKET == sAccept) { SetDlgItemText(hDIg, IDC_EDIT1, "服务器创建失败"); } else { SetDlgItemText(hDIg, IDC_RECVBUF, "服务器创建成功"); } } break; case IDC_RECVBUF: if (INVALID_SOCKET == sAccept) { } else { recv(sAccept, recvBuf, sizeof(recvBuf), 1000); SetDlgItemText(hDIg, IDC_RECVBUF, recvBuf); } break; case IDC_SENDBUF: GetDlgItemText(hDIg, IDC_SENDBUF, sendBuf, 1000); send(sAccept, sendBuf, sizeof(recvBuf), 1000); SetDlgItemText(hDIg, IDC_SENDBUF, ""); break; case IDC_STOP://关闭窗口  { closesocket(sAccept);   closesocket(sListen);   WSACleanup(); EndDialog(hDIg,wParam);   } break; } break; default: break; }
用户2965768
2018/08/30
2.5K0
socket---TCP服务器界面
多进程TCP并发服务器
我们的期望应该是一台服务器同时为多个客户服务。实现并发服务器最简单的办法就是为每个客户均fork一个子进程。
jackieluo
2018/10/06
5.9K0
多进程TCP并发服务器
获取HTML冻结窗口元素
在写爬虫时会获取页面的元素去定位,但是有些页面元素只在鼠标悬停时才会出现,鼠标离开后就会消失,这种情况很不利于去查看想要获取的元素。
sugarbeet
2022/10/04
2.8K0
TCP回射客户-服务器程序
创建一个TCP套接口,用通配地址(INADDR_ANY)和unp.h中定义的众所周知端口(SERV_PORT),端口号为9877。
jackieluo
2018/10/20
4.2K0
TCP回射客户-服务器程序
Android之TCP服务器编程android 之TCP客户端编程
推荐一个学java或C++的网站http://www.weixueyuan.net/,本来想自己学了总结出来再写博客,现在没时间,打字太慢!!!!,又想让这好东西让许多人知道。 关于网络通信:每一台电脑都有自己的ip地址,每台电脑上的网络应用程序都有自己的通信端口,张三的电脑(ip:192.168.1.110)上有一个网络应用程序A(通信端口5000),李四的电脑(ip:192.168.1.220)上有一个网络应用程序B(通信端口8000),张三给李四发消息,首先你要知道李四的ip地址,向指定的ip(李四i
杨奉武
2018/04/12
6.8K1
Android之TCP服务器编程android 之TCP客户端编程
QQ永久冻结解封方法
说到QQ永久封禁,说多了都是泪呀!五年前在从王者峡谷出来后就再也登录不上了,多次在腾讯客服小程序上申诉,每次都是那吊样,同样的理由同样的话术,有人就说找人工客服啊,在理的人都知道,腾讯没有人工客服。不对!是钱冲到位了就有人工客服。
浩瀚博客
2022/08/15
6.6K0
QQ永久冻结解封方法
SAP SD 解除订单信贷冻结处理
销售订单超出信贷额度后被冻结,不能再用于发货,需解除订单的信贷冻结才能继续执行相关业务。
用户5495712
2020/02/16
10.2K0
SAP SD  解除订单信贷冻结处理
SAP最佳业务实践:MM–库存处理:报废、冻结库存(131)-4冻结
4.3 MIGO冻结物料 – 将非限制物料库存调拨到冻结物料 需要冻结物料以防止进一步使用。这意味着不能将库存用于后勤,系统会将库存从 MRP 计算中排除。 1. 在初始屏幕上,确保在屏幕左上
SAP最佳业务实践
2018/03/28
8.6K0
SAP最佳业务实践:MM–库存处理:报废、冻结库存(131)-4冻结
tcp心跳包 - python TCP服务器v1.3 - 服务器抗压测试及关闭套接字处理
在长连接下,可能很长一段时间都没有数据往来。理论上说,这个连接是一直保持连接的,但是实际情况中,如果中间节点出现什么故障是难以知道的。这个时候,就可以使用心跳包,来维持长连接以及保活
zmh-program
2023/02/06
1.1K0

相似问题

德尔福,indy10 tcp音频流

26

使用tcp indy10的实时音频流

13

TCP套接字读写冻结服务器

22

停用时Indy TCP服务器冻结

13

TCP服务器在启动时冻结

13
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文