社区
网络编程
帖子详情
高分求同步异步的详细讲解
peter9606
2004-03-31 09:28:30
最好能有实际的例子
分数随你要(只要不是那种不合理的要求)
...全文
106
4
打赏
收藏
高分求同步异步的详细讲解
最好能有实际的例子 分数随你要(只要不是那种不合理的要求)
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
4 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
peter9606
2004-03-31
打赏
举报
回复
谢谢了 先给你50分可以么?
不过我还是不太明白select的原理
能否再给介绍一下select的原理呢?
itmaster
2004-03-31
打赏
举报
回复
{
继续查读状态或向对方主动发送
}
else
{
读数据
}
B、写
TIMEVAL tv01 = {0, 1};//1ms钟延迟,实际为9-10毫秒
int nSelectRet;
int nErrorCode;
FD_SET fdw = {1, sConnect};
nSelectRet=::select(0, NULL, NULL,&fdw, &tv01);//检查可写状态
if(SOCKET_ERROR==nSelectRet)
{
nErrorCode=WSAGetLastError();
TRACE("select write status errorcode=%d",nErrorCode);
::closesocket(sConnect);
//goto 重新连接(客户方),或服务线程退出(服务方);
}
if(nSelectRet==0)//超时发生,缓冲满或网络忙
{
//继续查写状态或查读状态
}
else
{
//发送
}
5、改变TCP收发缓冲区大小
系统默认为8192,利用如下方式可改变。
SOCKET sConnect;
sConnect=::socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
int nrcvbuf=1024*20;
int err=setsockopt(
sConnect,
SOL_SOCKET,
SO_SNDBUF,//写缓冲,读缓冲为SO_RCVBUF
(char *)&nrcvbuf,
sizeof(nrcvbuf));
if (err != NO_ERROR)
{
TRACE("setsockopt Error!\n");
}
在设置缓冲时,检查是否真正设置成功用
int getsockopt(
SOCKET s,
int level,
int optname,
char FAR *optval,
int FAR *optlen
);
6、服务方同一端口多IP地址的bind和listen
在可靠性要求高的应用中,要求使用双网和多网络通道,再服务方很容易实现,用如下方式可建立客户对本机所有IP地址在端口3024下的请求服务。
SOCKET hServerSocket_DS=INVALID_SOCKET;
struct sockaddr_in HostAddr_DS;//服务器主机地址
LONG lPort=3024;
HostAddr_DS.sin_family=AF_INET;
HostAddr_DS.sin_port=::htons(u_short(lPort));
HostAddr_DS.sin_addr.s_addr=htonl(INADDR_ANY);
hServerSocket_DS=::socket( AF_INET, SOCK_STREAM,IPPROTO_TCP);
if(hServerSocket_DS==INVALID_SOCKET)
{
AfxMessageBox("建立数据服务器SOCKET 失败!");
return FALSE;
}
if(SOCKET_ERROR==::bind(hServerSocket_DS,(struct sockaddr *)(&(HostAddr_DS)),sizeof(SOCKADDR)))
{
int nErrorCode=WSAGetLastError ();
TRACE("bind error=%d\n",nErrorCode);
AfxMessageBox("Socket Bind 错误!");
return FALSE;
}
if(SOCKET_ERROR==::listen(hServerSocket_DS,10))//10个客户
{
AfxMessageBox("Socket listen 错误!");
return FALSE;
}
AfxBeginThread(ServerThreadProc,NULL,THREAD_PRIORITY_NORMAL);
在客户方要复杂一些,连接断后,重联不成功则应换下一个IP地址连接。也可采用同时连接好后备用的方式。
7、用TCP/IP Winsock实现变种Client/Server
传统的Client/Server为客户问、服务答,收发是成对出现的。而变种的Client/Server是指在连接时有客户和服务之分,建立好通信连接后,不再有严格的客户和服务之分,任何方都可主动发送,需要或不需要回答看应用而言,这种方式在工控行业很有用,比如RTDB作为I/O Server的客户,但I/O Server也可主动向RTDB发送开关状态变位、随即事件等信息。在很大程度上减少了网络通信负荷、提高了效率。
itmaster
2004-03-31
打赏
举报
回复
利用Winsock编程由同步和异步方式,同步方式逻辑清晰,编程专注于应用,在抢先式的多任务操作系统中(WinNt、Win2K)采用多线程方式效率基本达到异步方式的水平,应此以下为同步方式编程要点。
1、快速通信
Winsock的Nagle算法将降低小数据报的发送速度,而系统默认是使用Nagle算法,使用
int setsockopt(
SOCKET s,
int level,
int optname,
const char FAR *optval,
int optlen
);函数关闭它
例子:
SOCKET sConnect;
sConnect=::socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
int bNodelay = 1;
int err;
err = setsockopt(
sConnect,
IPPROTO_TCP,
TCP_NODELAY,
(char *)&bNodelay,
sizoeof(bNodelay));//不采用延时算法
if (err != NO_ERROR)
TRACE ("setsockopt failed for some reason\n");;
2、SOCKET的SegMentSize和收发缓冲
TCPSegMentSize是发送接受时单个数据报的最大长度,系统默认为1460,收发缓冲大小为8192。
在SOCK_STREAM方式下,如果单次发送数据超过1460,系统将分成多个数据报传送,在对方接受到的将是一个数据流,应用程序需要增加断帧的判断。当然可以采用修改注册表的方式改变1460的大小,但MicrcoSoft认为1460是最佳效率的参数,不建议修改。
在工控系统中,建议关闭Nagle算法,每次发送数据小于1460个字节(推荐1400),这样每次发送的是一个完整的数据报,减少对方对数据流的断帧处理。
3、同步方式中减少断网时connect函数的阻塞时间
同步方式中的断网时connect的阻塞时间为20秒左右,可采用gethostbyaddr事先判断到服务主机的路径是否是通的,或者先ping一下对方主机的IP地址。
A、采用gethostbyaddr阻塞时间不管成功与否为4秒左右。
例子:
LONG lPort=3024;
struct sockaddr_in ServerHostAddr;//服务主机地址
ServerHostAddr.sin_family=AF_INET;
ServerHostAddr.sin_port=::htons(u_short(lPort));
ServerHostAddr.sin_addr.s_addr=::inet_addr("192.168.1.3");
HOSTENT* pResult=gethostbyaddr((const char *) &
(ServerHostAddr.sin_addr.s_addr),4,AF_INET);
if(NULL==pResult)
{
int nErrorCode=WSAGetLastError();
TRACE("gethostbyaddr errorcode=%d",nErrorCode);
}
else
{
TRACE("gethostbyaddr %s\n",pResult->h_name);;
}
B、采用PING方式时间约2秒左右
暂略
4、同步方式中解决recv,send阻塞问题
采用select函数解决,在收发前先检查读写可用状态。
A、读
例子:
TIMEVAL tv01 = {0, 1};//1ms钟延迟,实际为0-10毫秒
int nSelectRet;
int nErrorCode;
FD_SET fdr = {1, sConnect};
nSelectRet=::select(0, &fdr, NULL, NULL, &tv01);//检查可读状态
if(SOCKET_ERROR==nSelectRet)
{
nErrorCode=WSAGetLastError();
TRACE("select read status errorcode=%d",nErrorCode);
::closesocket(sConnect);
goto 重新连接(客户方),或服务线程退出(服务方);
}
if(nSelectRet==0)//超时发生,无可读数据
itmaster
2004-03-31
打赏
举报
回复
http://www-900.ibm.com/developerWorks/cn/linux/thread/posix_threadapi/part3/index.shtml
Xmos异步USB Audio驱动深入解析
本文
详细
介绍Xmos异步USB Audio驱动,对比同步与异步USB音频传输差异,阐述其在
高分
辨率音频支持、低延迟处理方面的特点。还探讨了该驱动在不同操作系统的兼容性、定制化与扩展性、稳定性保障及未来发展方向,以提升音频设备性能。
异步与同步的博弈:如何在YOLOv11推理过程中提升C#应用性能
在深度学习应用里,YOLOv11推理性能至关重要。本文从异步与同步编程模型角度,探讨在C#中实现性能优化。分析了异步与同步基本概念、YOLOv11推理性能瓶颈,介绍异步编程应用、同步操作优劣势,给出异步与同步结合的最佳实践,以提升推理性能和系统稳定性。
43、requestAnimationFrame 原理?是同步还是异步?
requestAnimationFrame 是浏览器提供的、在下一次重绘前执行回调的异步API,其执行时机与浏览器渲染帧强绑定,通常每帧约16.7ms(60Hz),但非固定周期。它不属于宏任务或微任务,而是渲染阶段专用的异步回调机制,可避免无效渲染、支持后台降频,并天然适配屏幕刷新节奏,广泛应用于JS动画、滚动/拖拽节流及视觉更新优化。
Python爬虫实战:Playwright 网络层截胡,全异步监听美团
高分
团购榜单!
本文基于Playwright实现异步网络层拦截,绕过美团前端JS加密参数,动态监听XHR/Fetch响应,精准捕获包含商户名、评分(≥4.5)、套餐、价格及销量的JSON数据;结合城市子域名切换与人工滑块协同验证,完成合规、可复现的
高分
团购榜单自动化采集,并导出为CSV。
python面试题复习-6.同步 vs 异步 阻塞 vs 非阻塞
本文系统梳理Python面试中高频考点——同步vs异步(关注调用结果获取方式)与阻塞vs非阻塞(关注线程状态)的本质区别。明确指出二者属于正交维度:同步可搭配非阻塞(如轮询),异步也可伴随阻塞(如等待回调)。强调核心要点:同步/异步决定控制流如何处理响应,阻塞/非阻塞决定线程是否让出CPU。适用于深入理解IO模型及asyncio底层原理。
网络编程
18,357
社区成员
64,165
社区内容
发帖
与我相关
我的任务
网络编程
VC/MFC 网络编程
复制链接
扫一扫
分享
社区描述
VC/MFC 网络编程
c++
c语言
开发语言
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章