请问WinSock SDK里面的select函数怎么用啊

chchch 2003-08-18 07:53:12
我现在必须用阻塞方式来Read和Accept,可是阻塞方式就停到那里,我的线程无法从内部关闭,我想请教select怎么用的,怎么能不停到那里
...全文
95 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
chchch 2003-08-22
  • 打赏
  • 举报
回复
唉呀,没有给smch(Ashes Of Time)分,我第一次来这个论坛,不会用这些
对不起啊,不好意思
chchch 2003-08-22
  • 打赏
  • 举报
回复
非常感谢nicolas2001(nick),我可以关闭贴子了
smch 2003-08-21
  • 打赏
  • 举报
回复
谢谢两位啊
有个问题啊,比如Accept和Recv,阻塞方式下,程序就会停到那里啊,那我怎么在线程内部关闭线程能.就算是设置了全局变量,也没有办法啊
还有就是那位高手能告诉我select怎么用啊,WSAASyncSelect我知道的,select的那几个参数我没看明白,也不知道select的作用是什么
另外,怎样在Accept和Recv之前能得到端口的状态呢?比如是否有connect请求或者数据要求接受的,然后我在调用相应函数接受,避免卡死
问题加分到60
--------------------------------------------------------------------
对于阻塞模式是无法在线程本身来关闭的(不能向下运行还怎么关闭?),必须由其它线程连接一下然后通过我说的方法。设置一个全局变量,判断是否继续向下走。
要象你说的,避免卡死只能用异步,同步必须要accept,否则客户端就无法connect。而一旦accept就阻塞。
nicolas2001 2003-08-21
  • 打赏
  • 举报
回复
select()* 执行同步I/O多路复用。
select函数的参数( int nfds, fd_set readfds,
fd_set writefds, fd_set exceptfds, const struct timeval timeout )
我记得是:第一个是个较为次要的值,设成0就行了。
后面的几个FD_SET类型的参数才是最重要的;
第一个FD_SET型的参数readfds是表示要被检查是否可读的 Sockets,把你想要接收数据的那个套接字放在这里;
第二个FD_SET参数ritefds是表示要被检查是否可写的 Sockets,将你要发送数据的套接字放在这里;
还有个FD_SET参数exceptfds是表示要被检查是否有错误的 Sockets
select() 函式的第五个参数timeout,是让我们用来设定 select 函数要等
待(block)多久。兹述说如下:

(1)如果 timeout 设为「NULL」,那么 select() 就会一直等到「至少」某
一个 socket 的事件成立了才会 return,这和其他的 blocking 函数一样。

select( ..., NULL ) /* blocking */

(2)如果 timeout 的值设为 {0, 0} (秒, 微秒),那么 select() 在检查后,
不管有没有 socket 的事件成立,都会马上 return,而不会停留。

timeout.tv_sec = timeout.tv_usec = 0;
select( ..., &timeout ) /* non-blocking */

(3)如果 timout 设为 {m, n},那么就会等到至少某一个 socket 的事件发
生,或是时间到了(m 秒 n 微秒),才会 return。

timeout.tv_sec = m;
timeout.tv_usec = n;
select( ..., &timeout ) /* wait m secconds n microseconds */

返回值: 成功 - 符合条件的 Sockets 总数 (若 Timeout 发生,则为 0)
失败 - SOCKET_ERROR (呼叫 WSAGetLastError() 可得知原因)

说明: 使用者可利用此函式来检查 Sockets 是否有资料可被读取,
或是有空间可以写入,或是有错误发生。

关于对FD_SET类型的操作,有几个比较重要的宏:
FD_ZERO(*set) -- 将 set 的值清乾净
FD_SET(s, *set) -- 将 s 加到 set 中
FD_CLR(s, *set) -- 将 s 从 set 中删除
FD_ISSET(s, *set) -- 检查 s 是否存在於 set 中

参数 readfds、writefds、及 exceptfds 都是 「called by value-
result」;而「called by value-result」的意思就是说,我们在将参数传给系统
时,要先设启始值,并将这些参数的位址(address)告诉系统;而系统则会利
用到这些值来做些运算或其他用途,最后并将结果再写回这些参数的位址中。
因此这些参数的值在传入前和函数返回后,可能会不同;所以每次调用
select() 前,对这些参数一定要重新设定它们的值。

假设我们要检查 socket 1 和 2 目前是否可以用来传送资料,以及 socket 3 是
否有资料可读;我们不打算检查 sockets 是否有错误发生,所以 exceptfds 设为
NULL。步骤大致如下:

FD_ZERO( &writefds ); /* 清除 writefds */
FD_ZERO( &readfds ); /* 清除 readfds */
FD_SET( 1, &writefds ); /* 将 socket 1 加到 writefds */
FD_SET( 2, &writefds ); /* 将 socket 2 加到 writefds */
FD_SET( 3, &readfds ); /* 将 socket 3 加到 readfds */
select( ..., &readfds, &writefds, NULL, ...) /* 调用 select() 来检查事件 */
if (FD_ISSET( 1, &writefds )) /* 检查 socket 1 是否可写 */
send( 1, data ); /* 调用 send() 一定成功 */
if (FD_ISSET( 2, &writefds )) /* 检查 socket 2 是否可写 */
send( 2, data ); /* 调用 send() 一定成功 */
if (FD_ISSET( 3, &readfds )) /* 检查 socket 2 是否可读 */
recv( 3, data ); /* 调用 recv() 一定成功 */

不知道说得清不清楚?你明白了没有?

chchch 2003-08-21
  • 打赏
  • 举报
回复
up
大家帮帮我啊
chchch 2003-08-20
  • 打赏
  • 举报
回复
谢谢两位啊
有个问题啊,比如Accept和Recv,阻塞方式下,程序就会停到那里啊,那我怎么在线程内部关闭线程能.就算是设置了全局变量,也没有办法啊
还有就是那位高手能告诉我select怎么用啊,WSAASyncSelect我知道的,select的那几个参数我没看明白,也不知道select的作用是什么
另外,怎样在Accept和Recv之前能得到端口的状态呢?比如是否有connect请求或者数据要求接受的,然后我在调用相应函数接受,避免卡死
问题加分到60
joinrry 2003-08-18
  • 打赏
  • 举报
回复
同意楼上的!
IO端口模型都是对于非阻塞方式(异步)来说的。
smch 2003-08-18
  • 打赏
  • 举报
回复
你如果要用select的话(也可以使用WSAAsyncSelect)就成了异步方式。对于同步方式,你可以使用多线程。并且在退出的时候由程序本身连接自己。然后设置一个全局变量。在线程中的accept下面判断该变量的值来决定是退出还是继续accept其它的请求。
摘自:http://mbstudio.spaces.live.com/blog/cns!C898C3C40396DC11!955.entry 2007/1/30 oSIP协议栈(及eXoSIP,Ortp等)使用入门(原创更新中) (CopyLeft by Meineson | www.mbstudio.cn,原创文章,欢迎转载,但请保留出处说明!) 本文档最新版本及文中提到的相关源码及VC6工程文件请在本站找,嘿嘿~~ (首页的SkyDriver公开文件夹中,可能需要用代理才能正常访问该空间——空间绝对稳定,不会丢失文件!) (最近工作重心不在SIP开发,SO本文档也没有机会更新,有技术问题也请尽量咨询他人,本人不一定能及时回复。)   一直没空仔细研究下oSIP,最近看到其版本已经到了3.x版本,看到网上的许多帮助说明手册都过于陈旧,且很多文档内容有点误人子弟的嫌疑~~   Linux下oSIP的编译使用应该是很简单的,其Install说明文档里也介绍的比较清楚,本文主要就oSIP在Windows平台下VC6.0开发环境下的使用作出描述。   虽然oSIP的开发人员也说明了,oSIP只使用了标准C开发库,但许多人在Windows下使用oSIP时,第一步就被卡住了,得不到oSIP的LIB库和DLL库,也就没有办法将oSIP使用到自己的程序中去,所以第一步,我们将学习如何得到oSIP的静态和动态链接库,以便我们自己的程序能够使用它们来成功编译和执行我们的程序。 第一阶段: ------------------------------------------------------   先创建新工程,网上许多文档都介绍创建一个Win32动态链接库工程,我们这里也一样,创建一个空白的工程保存。   同样,将oSIP2版本3.0.1 src目录下的Osipparser2目录下的所有文件都拷到我们刚创建的工程的根目录下,在VC6上操作: Project-Add To Project-Files   将所有的源程序和头文件都加入到工程内,保存工程。   这时,我们可以尝试编译一下工程,你会得到许多错误提示信息,其内容无非是找不到osipparser2/xxxxx.h头文件之类。   处理:在Linux下,我们一般是将头文件,lib库都拷到/usr/inclue;/usr/lib之类的目录下,c源程序里直接写#include 时,能直接去找到它们,在VC里,同样的,最简单的方法就是将oSIP2源码包中的Include目录下的 osipparser2目录直接拷到我们的Windows下默认包含目录即可,这个目录在VC6的Tool-Options-Directories里设置,(当然,如果你知道这一步,也可以不用拷贝文件,直接在这里把oSIP源码包所在目录加进来就可以了),默认如果装在C盘,目录则为 C:\Program Files\Microsoft Visual Studio\VC98\Include。   这时,我们再次编译我们的工程,顺利编译,生成osipparser2.dll,这时,网上很多文档里可能直接就说,这一步也会生成libs目录,里面里osipparser2.lib文件,但我们这里没有生成:)   最简单的方法,不用深究,直接再创建一个工程,同上述创建动态链接库方法,创建一个Win32静态链接库工程,直接编译,即可得到osipparser2.lib。 ------------------------------------------------------   上面,我们得到了Osip的解析器开发库,下面再编译完整的Osip协议栈开发库,同样照上述方法,分别创建动态链接库工程和静态链接库工程,只是要拷的文件换成src下的osip目录下文件和include下的osip目录,得到osip2.dll和osip2.lib。   在编译osip2.dll这一步可能会再次得到错误,内容含义是找不到链接库,所以,我们要把前面编译得到的osipparser2.lib也拷到osip工程目录下,并在VC6中操作:   Project-Setting-Link中的Object/Library Modules: kernel32.lib user32.lib ... xxx.lib之类的内容最后增加: osipparser2.lib   保存工程后再次编译,即可成功编译osip2.dll。 ------------------------------------------------------   至此,我们得到了完整的oSIP开发库,使用时,只需在我们的程序里包含oSIP的头文件,工程的链接参数里增加osipparser2.lib和osip2.lib即可。 ------------------------------------------------------   下面我们验证一下我们得到的开发库,并大概了解一下OSIP的语法规范。   在VC里创建win32控制台程序工程,将libosip源码包的SRC目录下的Test目录内的C源程序随便拷一个到工程时,直接编译(工程设置里照前文方法在link选项里增加osip2.lib,osipparser2.lib引用我们之前成功编译得到的静态库文件)就可以运行(带参数运行,参数一般为一个文本文件,同样从Test目录的res目录里拷一个与源文件同名的纯文本文件到工程目录下即可)。   该目录下的若干文件基本上是测试了Osip的一些基本功能函数,例如URI解析之类,可以大概了解一下oSIP的语法规范和调用方法,同时也能校验一下之前编译的OSIP开发库能否正常使用,成功完成本项工作后,可以进入下一步具体的oSIP的使用学习了。 ------------------------------------------------------   由于oSIP是比较底层的SIP协议栈实现,新手较难上手,而官方的示例大都是一些伪代码,需要有实际的例子程序参考学习,而最好的例子就是同样官方发布的oSIP的扩展开发库exosip2,使用exoSIP可以很方便地快速创建一个完整的SIP程序(只针对性地适用于SIP终端开发用,所以我们这里只是用它快速开发一个SIP终端,用来更方便地学习oSIP,要想真正掌握SIP的开发,需要掌握oSIP并熟读RFC文档才行,exoSIP不是我们的最终学习目的),通过成功编译运行一个自己动手开发出的程序,再由浅入深应该是初学都最好的学习方法通过对使用exosip开发库的使用创建自己的SIP程序,熟悉后再一个函数一个函数地深入学习exosip提供的接口函数,就可以深入理解osip 了,达到间接学习oSIP的目的,同时也能从eXoSIP中学习到正确使用oSIP的良好的编程风格和语法格式。   而要成功编译ExoSIP,似乎许多人被难住了,直接在XP-sp2上,用VC6,虽然你使用了eXoSIP推荐的winsock2.h,但是会得到一个 sockaddr_storage结构不能识别的错误,因为vc6自带的开发库太古董了,需要升级系统的Platform SDK,下载地址如下: http://www.microsoft.com/msdownl ... PSP2FULLInstall.htm(VC6的支持已经停止,这是VC6能使用的最新SDK)   成功安装后编译前需加OSIP_MT宏,以启用线程库,否则在程序中使用eXoSIP库时会出错,而编译时也会得到许多函数未定义的Warning提示,编译得到exosip2.lib供我们使用,当然,在此之前需要成功编译了osip2和osipparser2,而在之后的实际使用时,发现oSIP也需要增加OSIP_MT宏,否则OSIP_MT调用oSIP的线程库时会出错,所以我们需要重新编译oSIP了:),因为eXosip是基于oSIP的(同上方式创建静态和动态链接库工程,并需在Link中手工添加oSIP和oSIPparser的lib库)。 ------------------------------------------------------   创建新工程,可以是任意工程,我们从最简单的Win32控制台程序开始,为了成功使用oSIP,我们需要引用相关库,调用相关头文件,经过多次试验,发现需要引用如下的库: exosip2.lib osip2.lib osipparser2.lib WSock32.Lib IPHlpApi.Lib WS2_32.Lib Dnsapi.lib   其中,除了我们上面编译得到的三个oSIP库外,其它库都是系统库,其中有一些是新安装的Platform SDK所新提供的。   至此,我们有了一个简单的开发环境了,可以充分利用网上大量的以oSIP为基础的代码片段和官方说明文档开始具体函数功能的测试和使用了:) ------------------------------------------------------   我们先进行一个简单的纯SIP信令(不带语音连接建立)的UAC的SIP终端的程序开发的试验(即一个只能作为主叫不能作为被叫的的SIP软电话模型),我们创建一个MFC应用程序,对话框模式,照上面的说明,设置工程包含我们上面得到的oSIP的相关开发库及SDK的一些开发库,并且由于默认LIBC的冲突,需要排除MSVCRT[D]开发库(其中D代表Debug模式下,没有D表示Release模式下),直接使用eXosip的几个主要函数就可以创建一个基本的SIP软电话模型。   其主要流程为:   初始化eXosip库-启动事件监听线程-向SIP Proxy注册-向某SIP终端(电话号码)发起呼叫-建立连接-结束连接   初始化代码: int ret = 0; ret = eXosip_init (); eXosip_set_user_agent("##YouToo0.1"); if(0 != ret) { AfxMessageBox("Couldn't initialize eXosip!\n"); return false; } ret = eXosip_listen_addr (IPPROTO_UDP, NULL, 0, AF_INET, 0); if(0 != ret) { eXosip_quit (); AfxMessageBox("Couldn't initialize transport layer!\n"); return false; }   启动事件监听线程: AfxBeginThread(sip_uac,(void *)this);   向SIP Proxy注册: eXosip_clear_authentication_info(); eXosip_add_authentication_info(uname, uname, upwd, "md5", NULL); real_send_register(30);  /* 自定义函数代码请见源码 */   发起呼叫(构建假的SDP描述,实际软电话使用它构建RTP媒体连接): osip_message_t *invite = NULL; /* 呼叫发起消息体 */ int i = eXosip_call_build_initial_invite (&invite, dest_call, source_call, NULL, "## YouToo test demo!"); if (i != 0) { AfxMessageBox("Intial INVITE failed!\n"); } char localip[128]; eXosip_guess_localip (AF_INET, localip, 128); snprintf (tmp, 4096, "v=0\r\n" "o=josua 0 0 IN IP4 %s\r\n" "s=conversation\r\n" "c=IN IP4 %s\r\n" "t=0 0\r\n" "m=audio %s RTP/AVP 0 8 101\r\n" "a=rtpmap:0 PCMU/8000\r\n" "a=rtpmap:8 PCMA/8000\r\n" "a=rtpmap:101 telephone-event/8000\r\n" "a=fmtp:101 0-11\r\n", localip, localip, "9900"); osip_message_set_body (invite, tmp, strlen(tmp)); osip_message_set_content_type (invite, "application/sdp"); eXosip_lock (); i = eXosip_call_send_initial_invite (invite); eXosip_unlock ();   挂断或取消通话: int ret; ret = eXosip_call_terminate(call_id, dialog_id); if(0 != ret) { AfxMessageBox("hangup/terminate Failed!"); }   可以看到非常简单,再借助于oRTP和Mediastreamer开发库,来快速为我们的SIP软电话增加RTP和与系统语音API接口交互及语音编码功能,即可以快速开发出一个可用的SIP软电话,关于oRTP和Mediastreamer的相关介绍不是本文重点,将在有空的时候考虑增加相应使用教程,文章前提到的地方可以下载基本可用的完整SIP软电话的VC源码工程文件供参考使用,完全CopyLeft,欢迎转载,但请在转载时注明作者信息,谢谢! 第二阶段: ---------------------------------------------------   得到了一个SIP软电话模型后,我们可以根据软电话的实际运行表现(结合用Ethereal抓包分析)来进行代码的分析,以达到利用eXoSIP来辅助我们学习oSIP的最终目的(如要快速开发一个可用的SIP软电话,请至前面提到的论坛去下载使用oRTP和Mediastreamer快速搭建的一个基本完整可用的SIP软电话##YouToo 0.1版本的VC源码工程文件作参考)。   现在从eXosip的初始化函数开始入手,来分析oSIP的使用,这是第二阶段,第三阶段就是深入学习oSIP的源码了,但大多数情况下应该没有必要了,因为在第二阶段就有部分涉及到第三阶段的工作了,而且oSIP的源码也就大多是一些SIP数据的语法解析和状态机的实现,能深入理解了SIP协议后,这些只是一种实现方式,没必要完全去接受,而是可以用自己的方式和风格来实现一套,比如,更轻量化更有适用目的性的方式,oSIP则只起参考作用了。   eXosip_init()是eXosip的初始化函数,我们来看看它的内部实现:   首行是定义的 osip_t *osip,这在oSIP的官方手册里我们看到,所有使用oSIP的程序都要在最开始处声明一个osip_t的指针,并使用 osip_init(&osip)来初始化这个指针,销毁这个资源使用osip_release(osip)即可。   我们可以在代码中看到很多OSIP_TRACE,这是调试输出宏调用了函数osip_trace,可以用ENABLE_TRACE宏来打开调试以方便我们开发调试。   其它就是很多的eXosip_t的全局变量eXosip的一些初始化操作,包括最上面的memset (&eXosip, 0, sizeof (eXosip))完全清空和下面的类似eXosip.user_agent = osip_strdup ("eXosip/" EXOSIP_VERSION)的exosip变量的一些初始值设置,其中有一个eXosip.j_stop_ua = 0应该是一个状态机开关,后面可以看到很多代码检测这个变量来决定是否继续流程处理,默认置成了0表示现在exosip的处理流程是就绪的,即ua是 not stop的。      osip_set_application_context (osip, &eXosip)是比较有意思的,它让下面的eXosip_set_callbacks (osip)给osip设置大量的回调函数时,能让osip能访问到eXosip这个全局变量中设置的大量程序运行时交互的信息,相当于我们在VC下开启一个线程时,给线程传入的一个void指针指向我们的MFC应用程序的当前dialog对象实例,可以用void *osip_get_application_context (osip_t * osip)这个函数来取出指针来使用,不过好象exosip中并没有用到它,可能是留给个人自已扩展的吧:)      还能看到初始化代码前面有一段WIN32平台下的SOCK的初始化代码,可以知道eXosip是用的原生的winsock api函数,也就是我们可能以前学过的用VC和WINAPI写sock程序时(不是MFC),用到的那段SOCK初始代码,还有一段有意思的代码,就是 jpipe()函数,它们返回的是一个管道,一个有2个整型数值的数组(一个进一个出),查看其代码发现,非WIN32平台是直接使用的pipe系统函数,而WIN32下则是用一对TCP的本地SOCK连接来模拟的管道,一个SOCK写一个SOCK读,这段代码是比较有参考价值的:) j = 50; while (aport++ && j-- > 0) {   raddr.sin_port = htons ((short) aport);   if (bind (s, (struct sockaddr *) &raddr, sizeof (raddr)) transactionid)); }   即,只是打印一下调试,并没有完整实现什么功能,我们学习时,完全可以用相同的方法,定义一大堆回调函数,并不忙想怎么完全实现,先都是只打印一下调试信息,看具体的应用逻辑根据抓包测试分析和看调试看程序走到了哪一步,调用了哪一个回调,来明白具体回调函数要实现什么用途,再来实现代码就方便多了,当然,如果看透了RFC文档,应该从字面就能知道各个回调函数的用途了,这是后话,不是谁都能快速完全看懂RFC的,所以我们要参考eXosip:)      我们对其中的重要的回调函数进行逐个的分析:   ---------------------------   osip_set_cb_send_message (osip, &cb_snd_message) SIP消息发送回调函数   这个函数可能是最重要的回调函数之一,消息发送,包括请求消息和回应消息,一般情况下,状态机的状态就是由它控制的,发起一个消息初始化一个状态机,回应一个消息对状态机修改,终结消息发送结束状态机……   看cb_snd_message的函数实现,要以发现,其主要代码是对参数中的要发送的消息osip_message_t * sip进行分析,找出消息要发送的真实char *host,int port的值(这些参数可以省略,但要发送消息肯定需要host和port,所以要从sip中解析),最后根据sip中解析出的传输方式是TCP还是 UDP选择最终进行消息发送处理的函数cb_udp_snd_message,cb_tcp_snd_message处理(它们的参数一致,即本函数只是补全一些省略的参数并对消息进行合法性检查)。   **毕竟eXosip是一个通用的开发库,它考虑了要支持TCP,UDP,TCPs,IPV4,IPV6,WIN32,*nix,WINCE等等多样化的复杂环境,所以,我们可以略过我们暂时不需要的部分,比如,IPV6相关的代码实现等。      由于我们大多数情况下SIP是用的UDP,所以先来看一下cb_udp_snd_message的实现,它从全局变量exosip中获取可用的 sock,并尽最大能力解析出host和port(??难道前面的函数还不够解析彻底??如最终仍无port信息则默认设置为5060),使用 osip_message_to_str (sip, &message, &length)函数将要发送的格式化的SIP消息转换成能用SOCK传输的简单数据并发送即完成消息发送,代码中有许多复杂的环境探测和错误控制等等等等,我们可以暂时不用过多关注,可以继续向下,结尾处有一个keeplive相关代码,从代码字面分析,可能是SIP的Register消息的自动重发相关代码,可以在后面再细化分析。   cb_tcp_snd_essage的函数实现要比上文的udp的实现简单很多,主要是环境探测错误控制方面,因为毕竟tcp是稳定连接的,对比一下代码,可以看到主要流程还是将SIP消息转换后,发送到从SIP消息中解析出的host和port对应的目标。      看完两个函数,可以知道,eXosip需要有两个sock,是一个数组,0是给UDP用的,1是给TCP用的,要用SOCK当然要初始化,就是下文要介绍的eXosip的网络相关的初始化了,上面的exosip_init可以看成是这个开发库的系统初始化吧:)    至些,我们应该知道了oSIP开发的SIP应用程序的消息是从哪里发出的吧,对了,就是从这个回调函数里,所谓万事开头难,就象开发WIN32应用程序时,找到了WIN32程序的main函数入口下面的工作就好办了,下面就都是为一些事件消息开发对应的处理函数而已了:)   osip_set_kill_transaction_callback 事务终结回调函数   对应ICT,IST,NICT,NIST客户/服务器注册/非注册事务状态机的终结,主要是使用osip_remove_transaction (eXosip.j_osip, tr)将当前tr事务删除,再加上一系列的清理工作,其中,NICT即客户端的非Invite事务的清理比较复杂一些,要处理的内容也比较多,可以根据实际应用的情况进行有必要的清理工作:)   cb_transport_error 传输失败处理回调   对应于上面说到的四种事务状态机,如果它们在处理时失败,则在这时进行统一处理。   从代码可知,只是在NOTIFY,SUBSCRIBE,OPTION操作失败才进行处理,其它错误可直接忽略。   osip_set_message_callback 消息发送处理回调   根据type不同,表示不同的消息发送状态   OSIP_XXX_AGAIN 重发相关消息   OSIP_ICT_INVITE_SENT 发起呼叫   OSIP_ICT_ACK_SENT ACK回应   OSIP_NICT_REGISTER_SENT 发起注册   OSIP_NICT_BYE_SENT BYE发出   OSIP_NICT_CANCEL_SENT Cancel发出   OSIP_NICT_INFO_SENT,OSIP_NICT_OPTIONS_SENT,OSIP_NICT_SUBSCRIBE_SENT,OSIP_NICT_NOTIFY_SENT,OSIP_NICT_UNKNOWN_REQUEST_SENT   我们可以看到,eXosip没有对它们作任何处理,我们可以根据自己需要,比如,重发2xx消息前记录一下日志之类的,扩展一下retransmission的处理方式,发起Invite前记录一下通话日志等等。   OSIP_ICT_STATUS_1XX_RECEIVED uac收到1xx消息,一般是表示对端正在处理中,这时,主要是设置一下事务状态机的状态值,并对会话中的osip的一些参数根据返回值进行相应设置,里面有许多条件判断,但我们常用的一般是100,180,183的判断而已,暂时可以忽略里面复杂的判断代码。   OSIP_ICT_STATUS_2XX_RECEIVED uac收到2xx消息,这里主要跟踪一下Register情况下的2xx,表示注册成功,这时会更新一下exosip的注册字段值,以便让eXosip能自动维护uac的注册,BYE的2xx回应是终结消息,Invite的2xx回应,则主要是初始化一下会话相关的数据,表示已成功建立连接。   其它4xx,5xx,6xx则分别是对应的处理,根据实现情况进行概要的查看即可。   report_event (je, sip)是代码中用来进行事件处理的一个函数,跟踪后发现,其最终是使用了我们上文提到的jpipe管道,以便在状态机外实时观测状态机内的处理信息。      OSIP_NIST_STATUS_XXX_SENT即对应于上面的uac的处理,这里是uas的对应的消息处理,相比较于uac简单一点。   前面简单介绍了一下大量的回调函数及它们的概要处理逻辑,可能会比较混乱,暂时不用管它,只需要记得一个大概的形象,知道一个SIP处理程序是通过osip_set_cb_send_message回调函数来实现真实地发送各种SIP消息,并且SIP的标准事务模型是由oSIP实现好了,我们只需要给不同的事务状态设置不同的回调处理函数来处理事务,具体的状态变化和内部逻辑不用管就可以了。   下面来说一下消息处理回调函数用到的SOCK的初始化函数,即我们上面说的除了系统初始化外的网络初始化函数eXosip_listen_addr:   从上文知道了,系统将初始化两个SOCK,一个UDP一个TCP,但查看代码发现还有第三个,TCPs的,但好象还不能实用,现在不管它,代码首先是根据传输是UDP还是TCP来设置对应的数组值,并且如果没有提供IP地址和端口号,系统会自动取出本机网络接口并创建可用的SOCK(http_port 的方式暂不用考虑)。   SOCK初始化后,如何开始SIP事务的呢?看到这个调用eXosip.j_thread = (void *) osip_thread_create (20000, _eXosip_thread, NULL),对的,这里启用了一个线程,即,eXosip是调用oSIP的线程函数(没用系统提供的线程函数,是为了跨平台)进行事务处理的状态机逻辑是在一个线程中处理的,这样就明白了为什么一直没能看到顺序执行下来的程序启动代码了,接下去看,线程实际处理函数是_eXosip_thread,这里面的代码中,我们看到了上文提到的状态机控制开关变量while (eXosip.j_stop_ua == 0),即,当j_stop_ua设置为1时,osip_thread_exit ()结束事务处理即程序终结,再接下去看,_eXosip_execute是最终的处理函数了,而且它在程序未终结情况下是一直逻辑在执行,注意,要启用oSIP的多线程宏OSIP_MT。      看到_eXosip_execute的代码中有很多时间函数和变量,仔细看,除去一些控制代码,主要处理函数是eXosip_read_message (1, lower_tv.tv_sec, lower_tv.tv_usec),即取出消息,1表示只取出一条消息,其代码量非常的大,但同样的,其中也许多的控制代码和错误检测代码,我们在查看时可以暂时忽略掉它们。   eXosip_read_message读取消息时,即没有采用sock的block也没有用非block方式,而是采用了select方式,具体应用可查询fd_set相关文档。   根据jpipe_read (eXosip.j_socketctl, buf2, 499),我们可以估计,buf2中应该是保存的我们的控制管道的数据,具体作用至些还没有表现出来,应该是用来反映一些状态机内部的警示之类的信息,实际的SIP的处理的状态机的数据是存放在buf中,使用_eXosip_recvfrom获取的,获取后sipevent = osip_parse (buf, i)解析,使用osip_find_transaction_and_add_event (eXosip.j_osip, sipevent)来查询事件对应的事务状态机,找到后就如同其注解所说明的,/* handled by oSIP ! */,即我们上文设置的那一大堆回调函数,至此,我们知道了整个SIP应用所处理的大概流程了。   如果没有找到事务状态机呢?直接丢弃吗?不是的,如果这是一个回应消息,但没有事务状态机处理它,那它是一个错误的,要进行清理后才能丢弃,而如果是一个请求,那更不能丢弃了,因为UAS事务状态机要由它来启动创建的(回应消息表示本地发出了请求消息,即UAC行为,事务状态机应是由启动UAC的代码初始化启动的),整个逻辑应该是很简单的,但eXosip的实现代码却非常多,可见其花了非常多的精力在保证会话的稳定性和应付网络复杂情况上,我们可以对其进行大量的精简来构建满足我们需求的代码实现。   先来看错误的回应消息的处理函数eXosip_process_response_out_of_transaction,可以看到其代码就是一大堆的赋值语句,XXX= NULL,即将一大堆的运行时变量清空,再调用osip_event_free清空事件,或者就是一些复杂的情况下,需要通过解析现在的运行时数据,从中分析出“可能”的正在等待回应的对端,并发送相关终结通知消息等等,可以根据实际需要进行简化。   请求事件的处理 eXosip_process_newrequest,首先是对事件进行探测,MSG_IS_INVITE、MSG_IS_ACK、 MSG_IS_REQUEST……,对事件进行所属状态机分类,随后使用_eXosip_transaction_init (&transaction,(osip_fsm_type_t) tx_type,eXosip.j_osip, evt->sip)根据探测结果进行状态机初始化,实际调用的是osip_transaction_init,初始化后即将事件入状态机 osip_transaction_add_event (transaction, evt),由状态机自动处理后调用相应回调函数处理逻辑了。当然,eXosip为方便快速开发SIP终端应用,在下面又添加了许多自动化的处理代码,来和我们在回调函数中设置的处理代码相区分。   线程调用的事件处理函数代码最后是 if (eXosip.keep_alive > 0) {   _eXosip_keep_alive (); }   这段代码印证了上文提到了,keep_alive是用来设置是否自动重新注册,由_eXosip_keep_alive函数来实现自动将eXosip全局变量中保存的注册消息解析后自动根据需要重新向SIP服务器发起Register注册。   同样,因为注册消息发起是UAC的行为,将它放在这里,可以看出来所有事件消息的事务状态机处理都是在这里,只不过这里只创建UAS的事务状态机,UAC的事务状态机的创建则要继续到下面找了,从我们的YouToo软电话代码中可知,发起呼叫和发起注册分别调用了 eXosip_call_send_initial_invite,eXosip_register_send_register这两个函数(另外用到的两个build函数则是分别构建这两个send函数要发送的SIP消息),查看这两个函数可知,UAC的事务处理状态机是在这里进行初始化的。   eXosip_register_send_register中可以看到是_eXosip_transaction_init (&transaction, NICT, eXosip.j_osip, reg)初始化UAC状态机,实际也同UAS是调用的osip_transaction_init函数,同样使用 osip_transaction_add_event (transaction, sipevent)将事件入状态机,状态机随后将自动处理调用相应回调函数处理逻辑了。   另有osip_new_outgoing_sipmessage(reg),表示发送消息,到这里,我们应该可以理解,真实的发送操作,是要到由状态机处理后,调用了消息发送回调函数才真正地将注册消息发送出去的。   同注册消息发送,它是NICT状态机,呼叫消息的发送是ICT,由eXosip_call_send_initial_invite处理,_eXosip_transaction_init (&transaction, ICT, eXosip.j_osip, invite)初始化了状态机,之前还有一个eXosip_call_init是用来初始化eXosip的一些参数的,暂时不管它,同样 osip_new_outgoing_sipmessage (invite)发送呼叫消息,但实际还是要状态机处理后调用消息发送回调函数真实发送呼叫请求函数的,osip_transaction_add_event (transaction, sipevent)则标准地,将事件入状态机,状态机将能处理随后的应用逻辑调用相应的回调函数了。   好了,作了这么多的分析,我们了解了eXosip是怎样调用oSIP来形成被我能方便地再次调用的了,可以看到,为了实现最大限度的跨平台和兼容性,代码中有大量的测试代码,宏定义和错误再处理代码,看起来非常吃力,但了解了其主要的调用框架:   初始化,回调函数设置,UAC和UAS事务处理状态机的启动,事件处理流程等,就可以基本明白了oSIP各个函数的主要作用和正确的用法了,下一步,可以参考eXosip来针对某个应用,去除掉大量暂时用不到的代码,来构建一个简单的SIP软电话和SIP服务器,来进一步深入oSIP学习应用了。  ------------------------------------------------------ [下回预告:完全基于oSIP的软电话实现及oSIP进一步学习] (CopyLeft by Meineson | www.mbstudio.cn,原创文章,欢迎转载,但请保留出处说明!) 附件为原作者提供的
----------VC应用开发 [Visual.C..编程技巧精选500例]源代码. 内含各种例子(vc下各种控件的使用方法、标题栏与菜单栏、工具栏与状态栏、图标与光标、程序窗口、程序控制、进程与线程、字符串、文件读写操作、文件与文件夹属性操作、文件与文件夹系统操作、系统控制操作、程序版权信息、系统软件信息、 系统硬件信息、存储设备管理、鼠标及键盘、声音和视频、图形和图像、网络、数据库) 《远程控制编程技术》源代码 内含(重启、图片操作、ip操作、键盘与鼠标、客户端以及服务端、文件传输等实例源码) 多个VC++加密解密算法库(CRYPT++) 详细讲解了Crypt++的加密解密的使用以及其它的加密解密方法(例如base64加解密、哈希加解密以及其它的文件加解密),分静态库和动态库方法。 JSCalls_demo js调用的演示源码 树控件拖动 演示了在树控件中来回拖动文件的操作 MyPlayer 音乐播放器 内含歌词显示实现源码 ActiveXDemo 演示了装载以及卸载atl控件的操作以及注册操作 ado 登录模块的制作 如题,登陆数据库的操作。 ado,dao,odbc数据库连接vc代码 演示了不同的数据库的各种操作(连接、删除、添加……等等) ATL开发指南源码 内部包含了atl控件的开发以及如何应用,演示了COM的包容与集合、自动化、事件和连接点、枚举器和集合以及线程管理等等。 ATL实现的CDHtmlDialog模板类v1.03 使用了六个类五个模块类演示了atl的调用方法 class CDHtmlSinkHandler; // Events Sink Base class CDHtmlEventSink; // IHTMLDocument2 Events Sink // IDispatch class CDHtmlControlSink; // ActiveX Control Events Sink // IDispatch class CDHtmlElementEventSink; // IHTMLElement Events Sink // IDispatch class CExternalDispatchBase; template class CExternalDispatchImpl; // External Dispatch Implement // IDocHostUIHandleDispatch template class IDocHostUIHandlerDispatchImpl; // IDispatch template class DWebBrowserEvent2Impl; // ATL::CDialogImplBaseT template class CDHtmlDialogImpl; template class CMultiPageDHtmlDialogImpl; autoplaysnd mp3 播放器源码 重载了自带的控件进行播放 aviplayer avi播放器源码 引用了atl控件播放 beautifulskin 源码 演示了各种控件方法 Browser.Net源码 C#的一个网页游览的例子 C++自绘窗体的完整代码 注释非常详细,相信会帮助大家设计好自己的个性窗体。 C++_Primer_第4版_中文+英文 原书源码+课后习题答案。 CameraController(云界面) 实现了自绘控件,云端控制主要在CnComm类多线程串口通讯库, camerads-DirectShow使用示例 演示了摄像头的使用 CatListBoxDemo ListBox控件与其它控件阙套使用方法 CCAMS系统是一种用于局域网下的CS模式的软件管理和监测系统源码 它包括客户端和服务端,客户端软件主要作用是监测本主机的活动,并将监测到的信息定时发送给服务器。服务器可以将收集到的信息以柱状图和文件列表以及其他方式呈现给用户,以便用户对局域网内的主机进行监测和管理。 CClockST_demo 电子钟的实现,自绘Button、Static的实现,其中自定了一个辅助主题风格类。 CctryLog(web拦截网页帐号密码) 实现了一个控件去获得IHTMLDocument2接口,然后读取内容,匹配用户名与密码等。 CFile64_src 操作大文件,自定义了一个操作大文件的类,并进行了测试。 chapter7 实现了声音录制等功能。 CHtmlViewProjV2 详细演示了HtmlView的使用与HtmlView事件站点拦截的实现、js调用。 CIVStringSet_Demo 自定义了一个类似STL容器的类,并进行了测试。 ClearHistory 实现了 清楚internet临时文件、Cookie的清除、游览器地址栏历史地址的清除、清楚表单自动完成历史记录、清楚自动密码历史记录、清除收藏夹中的内容、清除RAS自动拨号历史记录、清除系统临时文件夹、清空回收站、清除"运行"中的自动匹配历史记录、清除"文档"中的历史记录、清除上次登陆用户记录、清除"查找文件"自动匹配历史记录、清除"查找计算机"自动匹配历史记录、清除网络联接历史记录、清除远程登录历史记录、清除浏览网址历史记录。实现的代码很简单。 CListCtrl 阙套其它控件 自绘了CListCtrl 控件,实现了其它控件阙套到List中并自绘等。主要的实现在CListReport类中。 CListCtrlTest 演示了重载CListCtrl后的使用方法。 CListItem Drawing 演示了其它控件(全部)阙套到List中并自绘等,学习自绘以及阙套CListCtrl 控件的好实例。 ColorStatic 自绘了CStatic控件,实现了标题字符滚动效果。 CSDN免积分下载工具 源码 演示了使用CInternetSession去下载资源。 CStatic文字滚动 如题,此实例非常适合学习,重载并自绘了Wnd类,效果是上下文字、图片、文字由大到小和星星闪烁等滚动效果。实例使用了加载类似xml文件读取信息,然后显示。 COM_ATL_Tutorial 简单的atl控件演示 COM接口挂钩及其应用 如题。 CSkinSlier CSliderCtrl自绘 Cursor 生成图标,运行到鼠标图标。 cutscene win32下实现视频播放。 C视频源代码 视频教程步骤源码 DDraw DirectX 实例 DES加密算法源代码 如题。 Detected memory leaks 检查内存泄漏源码 DigiStatic_src 自绘CStatic实现数字效果。 DirectShow开发指南pdf附属代码 如题。 DirectShow开发指南源码 如题。 directUI_D DirectUI界面库 DOM应用---遍历网页中的元素 如题。 dshowplayer 媒体播放器的实现,实现了VMR7、VMR9、EVR方式。 DSoundManager 实现了声音管理。 Excel文件的导入和导出操作 如题。主要的实现在CMyExcel类中。 expclass_src dll库的演示。 fge.1.1.alpha.sdk 精灵系统,一套MFC渲染引擎,含2D/3D等渲染,效果看源码,IFEngine是整个引擎接口,IFSystem是硬件查询系统,IFApplication是应用程序对象基类。 FlashPlayer播放器4.0的VC++源代码 如题。 FreeBird2011最初版(模仿飞鸽,可聊天+传文件) 该实例可进行局域网的聊天、一对多、多对一、和多对多的传送和续传,理论上这是我本人的实现目的,而且目前经测试已基本实现了上述功能,而且网速一般有几M/S。另外有只打开一个应用程序、CRichEdit的使用、最小到托盘、自动检测在线用户(多播组)等。 FreeBird2011Dlg.h 主对话框类头文件 MultiGroup.h 多播组类头文件 UserLink.h 用户链表类头文件 ListenSocket.h 侦听接口类文件 ChatSocket.h 聊天接口类文件 SettingDlg.h 设置对话框类文件 LocalInfoDlg.h 查看本地信息对话框类文件 freeeim_FreeEIM_企业即时通讯软件源代码2010年8月份最新版 如题。 FTP、HTTP 多线程断点续传下载文件 源码 如题。 gdiplus应用实例 如题,自绘控件的实现。 gdiplus应用实例2 如题,自绘控件的实现。 GetFileVersion 这个例子就是查询任何可执行文件的版本信息并且 C++builder 和 VC 都通用,只需要把 AnsiString 替换成 CString 就行了。 gh0st v3.6 源码 - 可下断点调试! 如题。详细见源码。 GMem 内存管理单元源码。GMem.cpp和GMem.h是内存管理单元的源码文件。完成端口通讯模块内存管理。 haisanidsV1.2-网络连接监控 IP实时数据。自绘了很多控件。自绘CTabCtrl、CToolBar、CMenu、CButton、CHtmlCtrl、CListCtrl。 1.初始状态只监听连接,不捕获IP数据 2.鼠标右击列表选择或取消监控某端口数据 3.为防止ping攻击,一般情况ping数据全部监控 4.监控某端口数据时,不监控ping包 5.数据超过20k将被清空 6.右边窗口停止抓包后显示十六进制数 hyperlink 自绘CStatic,实现超链接。 iconbutton_demo 演示了多种自绘Button。 IDocHostUIHandler Extended CHtmlView 如题。 IM_毕业设计 聊天系统,操作了数据库,有服务端和客户端。 ini文件的类适合VC使用 如题。 Inline Hook(ring3) 简单源码 代码里用了备份dll的方法,因此在自定义的函数中可以直接调用在内存中备份的dll代码,而不需要再把函数头部改来改去。 IOCP反弹远控客户端模型,外加上线服务端,全部代码注释! 如题。这个是IOCP远程控制软件的模型,服务端运行后会自动发送本机信息到客户端,客户端采用IOCP重叠机制。 IOCP封装类(DLL)发布 主要是CIocpSrv"伪类",实际上还是调用的DLL, IOCP完成端口 [1]---选择 - Select [2]异步选择 - WSAAsyncSelect [3]---事件选择 - WSAEventSelect [4]---重叠I [5]---完成端口 IP所在地查询器 如题。 jpeglib_demo 处理Jpeg图片。 KeyHook 键盘钩子,截获键盘信息。 Kugou7+UI 界面设计。学习界面的好实例,强烈推荐。 自绘button 如题。 自绘MENU 如题。 自绘tab 如题。 自绘Tree 如题。 自绘按钮button源代码 如题。 自绘编辑框 如题。 自绘窗体界面 如题。 自绘对话框 如题。 listbox-6 重载CListBox,演示了拖动功能。 Mail_Report 演示了发送邮箱的功能。 MD5算法 如题。 MediaPlayer 视频播放的实现。 MFC 对话框 MP3 内部包含:mp3播放器Lrc歌词同步源程序代码分析、mp3播放器+支持歌词同步显示哦、简单音乐播放器。 mfc 解码 视频音频解码部分。 MFC_MultiSender_OVER 文件传送,多文件(超大文件)传送功能的实现,含文档。 MFC+DLL的编写和调用示例 如题。 MFC换肤完全贴图实现 如题。 Smile简体版 很简单,只能播放mp3格式的音乐。 功能: --------------------------------------- --------关闭-- 打开----最小化------- --------------------------------------- 显示歌曲名字 -------------------- ------------------ ---暂停并从 ----- -- - 上一曲------ 头开始播放 | 显示时间 | | | ---开始和暂停 ----------- 下一曲------ -------------------------------------- Linux内核完全注释附 如题,我没看。 MFC+消息循环贴图---金山毒霸界面 自绘控件实现。 MFCDemo DirectUI移植到MFC中实现。 MFCHtml 调用脚本 如题。 MFC使用COM加载WMI服务,另类获取系统服务详细 大家都知道,现在流行的检测硬件软件视乎很神秘,我们要获得各种信息好像比较难.但大多数这种软件或多或少的使用了WMI,如果我们能熟练掌握相信你也做的处理.另外WMI除了查询还能修改,比如3389端口,账号,密码,服务启动与关闭只要你想做的几乎都可以,因为WMI代替我们去与硬件打交到了,甚至是系统底层! MiniPlayer 源代码 媒体播放实现。 MP3解码 代码 内部包含多种实例实现MP3解码,有开发文档。 MP3解压程序源代码 如题。 MPEG4播放器源代码 如题。 MSN 仿真界面全部源代码 如题,非常好的界面设计实例,自绘控件的实现。 Mufan MP3播放的实现。 MYICQ 0.8 alpha1 (仿腾讯QQ整套聊天系统) 老版qq系统的实现。 MyIE3.0浏览器源代码 如题。完整的代码,重载控件实现,非常适合初学者。 MyPhpServer(原创,有实现的主要代码) 如题。 microcai-ibus-t9-输入法源码 如题,主要源码就几个,详细见代码。 MzfHips主动防御 主要在MzfHipsDlg中,程序分析进程数据、驱动数据、注册表数据从而实现主动防御。 超级下载 不过不是c++源码 1:综合FTP下载和HTTP(网络蚂蚁)(多线程). 2:FTP下载支持多个站点同时下载一个文件(同时支持断点续传). 3:可以在不下载ZIP.RAR.ISO文件的情况下查看文件里面的目录文件. 4:支持多语言. 5:操作综合其它软件. 6:自定义快捷键. 7:在IE工具栏上加按钮,可以直接拖动连接到按钮上下载. 8:注册采用激活方式. 9:采用Messenger的弹出滑动消息提示框. 10:下载管理,虚拟文件夹. 11:自动ping. 12:连接到搜索引擎. 13:自动报告bug,建议等. 14:宏功能. 15:自动同步文件夹. 16:保存加载任务. 17:计划任务. 18:单线程下载时不能创建临时文件. 19:下载流文件(rm,Media Player). Notepad++ V5.6.8 源码! 如题。 OA精灵代码 c++版 一套oa系统。 ocxdlgtest dll的一个实例。 OD反汇编引擎(带VC修改版和原版) 如题。主要文件就4个,非常适合学习,详细见源码。 OPENG开发的示例代码c++版 演示了OpenG的使用方法,内含几个实例,一个实例就3个文件。 p2p vb实例。 p2p+technology 文档。 P2P视频技术源码(含开发文档) 目前的协议有如下一些特点: 1) 客户向服务器发送请求, 每个请求的长度不定. 请求的长度在第一个INT中指定. 2) 每个服务器通常会向多种客户提供服务, 例如, TS要同时向CP, NP提供服务, CP要向NP和其他CP提供服务, 同时还是其他CP, TS, SP的客户. 3) 每个服务器为客户服务时, 通常是长期的, 会涉及多次请求-应答的来回. PcShare 内含远程控制、进程管理、文件操作、视频控制、注册表操作、客户端服务器端。 redui_src_v0.9.130(DirectUI 3D) DirectUI 3D界面库。 sdk(界面库) RINGSDK包含界面库和图象库。 绘MFC基本控件 ) 如题。 PlayerDrectShow win32情况下实现媒体播放。 preemptivepopupkiller C#源码,实现简单游览器。 RangeScan扫描器源代码 ip地址扫描,发送邮箱。 ResizableLib 测试开源界面库Resizable。 RsPicture 自定义了一个图片库,然后引用测试。 SimplePlayer 简单的媒体播放源码。 Skin_Combo_Box_demo 自绘Combox控件的实例。 SkinList_Demo 自绘List控件的实例。 Smile 自绘List控件的实例。 SOCK登录SSL加密网站 调用ie接口。主要的代码在IEComCtrlSink中。 sqlite3使用 引用了Splayer中的Sqlite3库,进行了测试。 SrcFirstProg 简单的窗口程序。 SuperGrid - 特别的 listview 控件 网格形式的视图,自绘了CComboBox、CEdit、CSuperGridCtrl实现。 tab 演示了CTabCtrl控件的使用方法。 tabcontrol_demo 自绘了CTabCtrl的实现。 To Create A COOL Desktop Lyrics Demo 歌词显示,效果非常好。对话框实现。 TopMost 自绘CListCtrl的实现。 Trace程序 演示了输出信息。 TransparentStatic 自绘CStatic控件。 TreeView控件 自绘CTreeView控件。 VC 创建向导模式 如题。 VC 精品源码打包下载(解) CatListBox_src.zip CatListBox_demo.zip 这个程序模仿Outlook建立分类列表框。 CClockST_src.zip CClockST_demo.zip 一个简单的数字时钟程序,其中的date类派生于MFC CStatic 基类。 CIVStringSet_Demo.zip CIVStringSet_Source.zip 基于MFC和STL平台的字符串类,可以实现在快速字符串搜索。 enum_display_modes_demo.zip enum_display_modes_src.zip 列出所有的显示模式并列表出来,通过单击列表来改变显示分辨率。 iconbutton_demo.zip iconbutton_src.zip 创建一个按钮,并在上面显示图标。 jpeglib_demo.zip jpeglib_src.zip 利用Delphi的代码在VC中显示JPG图片,不使用动态连接库。 Mail_Report.zip 一个邮件报告程序。 SrcFirstProg.zip 解释了最基本的MFC程序流程。 tabcontrol_demo.zip tabcontrol_src.zip 自定义的标签控件对话框。 Undo_demo.zip undo_src.zip 在VC中实现Undo和Redo功能。 VC 利用底层键盘钩子屏蔽任意按键MaskKey 动态链接库实现钩子,然后程序调用。 VC 透明窗口效果的电子标尺源代码 实现了屏幕绘图操作,实现电子标尺数据计算以及显示,有数据库操作保存数据。 VC++ ini文件读写操作类实例 如题。 VC++版源代码统计工具 如题。内含自绘CMenu、CButton、CDialog、CStatic、CListCtrl等。 VC++6.0 控制摄像头 一个视频捕捉类对摄像头的操作。 VC+++暴风影音(Media+Player+Classic)源码 知道的人不多,但提起国内的暴风影音,我想知道的人就多了,其实暴风影音就是Media Player Classic,暴风影音只是同我一样从Gabest官方下载到了Media Player Classic的源码,不同的是,暴风影音将Media Player Classic改成了自己的名字并加入了许多的解码器,打包成自己的产品,其实这也无可厚非,关键就在于其作者老爱把里面捆绑一些我们用不到的软件. TT--仿qq+p2p通讯(nat穿透) 如题。 VC++遍历文件夹自动生成目录树 对CTree控件的操作。 vc++动态链接库(dll)编程深入浅出 内含开发文档。主要是对动态链接库的教程。 vc++动态链接库编程之DLL典型实例源代码下载 如题。 VC++仿Dreamweaver取色器源代码 如题。非常简单。 VC++挂机锁屏系统源程序 如题。非常简单。 VC++建立桌面或开始菜单快捷方式 如题。非常简单。 VC++界面库编程 SkinMagic 2.21 动态库版本的使用和 Skin++动态库及静态库版本的使用。 VC++精仿QQ2008窗体及分类菜单 效果逼真。就是几个控件的自绘以及使用。 VC++卡通风格气泡提示源码 重绘窗体实现。 VC++实现任务管理器源码 任务管理器应该大家都很熟悉,论坛里也有好多的任务管理器的源码,解决CListCtr刷新时滚动条跳到开始处。 VC++实现网络连接查看器源码 非常好的一个实例,把网络连接的UDP/TCP都插入到CList控件中显示出来。 VC++视频捕捉系统 win32下 视频操作。 VC++视频会议系统(完整) 有开发文档。使用了系统自带的视频。 Windows核心编程(第五版)随书源代码 如题。 vc-ftp 多线程操作多文件传输的操作。 VC版下载者 源码 非常简单的一个实例,使用了URLDownloadToFile下载文件。 VC断点续传源代码 从fnMyDownload开始,程序首先解析输入的url,拆分为地址,路径,文件名等。然后获取文件头,得到文件大小,然后再下载。重点函数是ThreadDownLoad。下载完之后用FileCombine合并文件。Mydownload.cpp底端的fnMyDownload函数是下载器的关键函数。 点对点多线程断点续传软件《传圣》源代码 本实例适用于装有IP/TCP协议的电脑. 主要功能:电脑间传送大型文件.(如电影等) 主要特点: 1.采用了多线程技术,速度明显高于同类软件. 2.支持多文件同时传送. 3.支持段点继传,也就是说文件可分N次传送. 4.分服务端和客户端,服务器支持多客户. 5.在传送过程中可实实对话,有聊天功能. 6.为了提高效率,本软件做得短小精悍,两文件总共只有100K,直截运行,不用安装. 7.麻雀虽小,但五脏俱全,功能多,操作方便. 使用方法: 在服务端加入要传文件,客户端输入服务端IP地址(服务端运行后会显示),点击连接,即会显示服务端文件,双击即可下载! 现在是测试版,欢迎多提意义. 断点续下 内含:多文件下载、多文件发送、下载进度条显示等。 多任务多线程断点续传DLL 如题。 多线程文件下载 如题。 多线程查找文件(功能增强版) 自定义了一个文件搜索类。多线程实现。 多线程高速文件搜索程序源码 自定义了一个文件搜索类, 实现: BOOL StartFinder(); //开始查找 void PauseFinder(); //暂停查找 void ResumeFinder(); //继续查找 void StopFinder(); //停止查找 void Finde rReset(); //查找重置 功能。 VC++视频聊天系统源代码 实例简单,有用户登录、传输文件、视频、画质调节、禁音检测、回音消除、自动增益、噪音抑制、视频控制等、 VC++搜索指定文件夹中的文件 如题。非常简单。 VC++文件分割、合并工具 自绘了Button、CProgressCtrl、CAutoFont。主要操作在CFileSpltDlg中。 vc++写的音乐播放器 如题。含有绘图效果。 VC++制作3D效果的旋转文字特效 如题。 VC++注册码加密源程序(含注册机、解密机) 压缩包内有两个源码包,一个是注册机源程序,另一个是解密机的源程序,一套完整的参考实例。 VC+MapX源码含GPS跟踪演示 如题。 VC3D 利用VC编程在界面上实现3D文字 在MFC应用程序中浏览PDF、Word文档文件 如题。 vcdialog 自绘对话框。 vc编程:自动停靠窗体,吸附窗体 OnMoving事件处理。 vc基于HTTP协议断点续传和多线程下载源代码 如题。 VC满屏开满玫瑰花 如题。 VC然输入框出现气球提示 调用系统自带的提示显示。 VC实现创建模态对话框 如题。 VC释放EXE资源文件 如题。 vc网络 网络系列使用教程。 VC星号密码探测显示程序 简单。 vc网络通信编程实用案例精选 局域网网络通信编程实例、IE编程实例、基本网络编程实例、网络通信协议编程、Modem /串口通信编程、代理服务器编程实例、高级网络通信编程实例。 Visual_C++网络高级编程 TCP/IP协议、Winsock网络编程接口、Visual C 与网络编程、基本网络编程技术、Telnet协议的实现、HTTP协议的实现、 FTP协议的实现、文件下载、UDP协议的实现、ICMP协议的实现、PPP协议的实现、代理服务器的实现、 ATL DCOM和ActiveX技术、网络安全。 vld-10-src 内存泄漏检测源码。 vmrplayer 简单播放器的实现,集成到了一个类中。 ATL开发Gif的ActiveX控件 如题。使用控件显示gif文件。 weather(天气预报界面) 通过soso网站获得城市以及天气信息。 WebBrowser-Httprequest(http请求捕捉) 如题。 Win32多线程程序设计 有文档以及源码。 Windows Media Player界面的实现 如题。 Windows Shell扩展 实现文件拷贝。 windows设计 源码 书本源码。1.VC++的基本使用 2.一个简单的HelloWorld程序 3.进程的创建 4.进程控制 5.控制其他进程 6.游戏内存修改器1 7.游戏内存修改器2 8.多线程 9.线程的优先级 10.线程同步 11.第一个窗口程序 WINDOWS网络编程技术-附源码 如题。内有文档以及源码。 WM调用DrectShow例子 wm播放器。 XFileDialog_demo xml文件操作。 xml 树控件的使用,以及ChtmlView或站点拦截调用等。 XML文件读取及管理工具VC++源码 重写了很多控件,重要功能源码集合到了CXML类中。 暴风压力测试2010(V7.0)源码 如题,演示了攻击服务端的源码,tcp多连接攻击、cc攻击等等……。 播放器 MM ARM_流媒体、暴风影音源码用于编解码分析。 超清晰播放器源代码 如题。 超旋的音乐播放器 含歌词……,效果看源码。 穿还原的下载者 C++源码 驱动程序可以穿透还原卡,并且可以修改系统文件,这里是通过修改系统文件userinit.exe来实现的。userinit.exe的功能很简单,就是启动explorer.exe。这里就是通过替换uerinit.exe,伪造一个userinit.exe。这个伪造的程序可以实现uerinit.exe的原始功能,并可以实现自定义的功能,比如下载执行,发送数据。 窗体透明、窗体上控件和DC绘图不透明 如题。 从dll中动态装载类的源程序 如题。 打印函数 测试打印函数的功能。 大型多媒体视频会议服务器端和客户端源码VC 如图,基于H323格式。 发一个界面库skin#全集合 SkinH_VC使用帮助(含源码)、Skinsharp V1.0.6.6各种语言全破解、vc全部函数各自独立的demo、制作皮肤工具。 仿360杀毒软件界面源码 MFC重载控件实现了360界面效果。 仿QQ、MSN信息提示窗口 重载CWnd实现了动画显示。 仿QQ2011界面的源码 如题。 仿QQ信息提示窗口 如题。 仿金山词霸界面 如题。 仿制金山毒霸专杀工具界面 如题。 漂亮c 界面源码 如题。 漂亮的编辑框 重载CEdit实现自绘。 实现QQ界面绝对经典 如题。 用户界面多线程 多线程的使用。 搞基控件 ComboBox 演示了ComboBox控件的使用方法。 搞基控件 List Ctrl 演示了List Ctrl控件的使用方法。 搞基控件 ListBox 演示了ListBox控件的使用方法。 搞基控件 Tab Ctrl 演示了Tab Ctrl控件的使用方法。 搞基控件 TreeCtrl 演示了TreeCtrl控件的使用方法。 带加密功能的SQLite3.3.6封装类 如题。 第12章+DLL开发与系统编程 创建导出浮点数四则运算函数的Win32 DLL、使用显式方式调用DLL实现浮点数的四则运算、使用隐式方式调用DLL实现浮点数的四则运算、创建Win32 DLL导出一个全局变量、调用DLL,获取其导出的全局变量值、创建Win32 DLL导出一个计算长方体表面积和体积的类、调用DLL,使用其导出类计算长方体的表面积和体积、创建MFC常规DLL,通过导出函数显示颜色信息对话框、调用MFC常规DLL,显示颜色信息对话框、创建MFC扩展DLL,实现圆形按钮类、调用MFC扩展DLL,创建圆形按钮、创建记录键盘动作的全局钩子DLL、调用键盘钩子DLL,实现监视系统的键盘操作、创建记录当前鼠标所在窗口标题信息的鼠标钩子DLL、调用鼠标钩子DLL,显示鼠标所在窗口的标题、获取当前操作系统的版本信息、获取系统CPU信息、获取系统内存的相关信息、获取当前系统所有安装的硬件设备、调用系统关机对话框、编码实现关闭和重启计算机、实现休眠计算机,并创建快捷键、显示并设置系统的显示属性、隐藏显示系统的任务条、改变系统的桌面壁纸。 对磁盘下任意目录的动作进行监控 创建线程不断的监视。 多功能小闹钟 不规则窗体效果显示,实现了多功能的小闹钟。 仿QQ和飞秋的局域网聊天程序(文件+语音) 这个程序用的协议是UDP,socket是CAsyncSocket,这是我在这个网站看到了qq也优先用UDP来连接服务器,连上服务器,能获得服务器上的人员列表,客户端的人员列表随用户上下线改变,服务器掉线了 也能收到通知,双击用户名字可以聊天,聊天窗口上有个文件传输,在我电脑上能传输一些小文件,但在别人电脑上就会使程序崩溃。 工具栏画到标题栏上 如题。 关联文件 自动恢复系统文件关联,以及文件关联操作的代码。使用注册表防止多次运行。 基于CDialogBar的IE多标签栏的实现 如题。 基于IE内核的多进程浏览器Raptor 基于WTL控件实现了多进程。 极速FTP客户端程序(VC++版) 如题。 截屏mfc和dll程序 如题。 进程防杀的实现 Hook TerminateProcess()函数,每次TerminateProcess()被调用的时候先判断企图结束的进程是否是我的进程,如果是的话就简单地返回一个错误码就可以了。 精美挂机锁源码 如题。 局域网视频监控 如题。 客户端和服务器 考虑到作为服务器的一端一般来说是固定的,所以当开启服务器后,一般服务器是不能停止的,所以在正式的软件里面,作为客户端让输入的服务器端IP的那一项是可以省略的,因为在制作安装程序的时候可以将服务器IP直接固定,但是这个作为简单的功能演示版本考虑到作为服务器的一端可以为任意电脑,所以在客户端设置了填写服务器IP。运行时:首先是运行Sever.exe服务器端,然后是“开启服务器”,“产生新的随机码” ,然后运行Client.exe客户端,输入用户名和密码,然后输入服务器端IP地址,然后登陆服务器,如果密码或者登陆号不正确会有提示,也可以选择试用版的软件。 快捷键 演示了快捷键设置的代码。 类似QQ截屏的屏幕取色器 主要功能在CColorPickerDlg中。 两款拼音输入法源代码 拼音输入法、AboutWiz_src。 枚举进程 系统监视 有磁盘监视、系统目录监视,任务栏监视、端口监视、流量监视等等。 媒体播放器 如题。音乐播放器的实现,内有文档以及总结。 模仿QQ抖动 如图,简单。 闹钟软件V1.0 (带VC++源码) 基于MFC窗体的闹钟。 能弹出复选框组合列表的combobox 如题。 屏幕放大镜源代码 如题。 屏幕监控+远程控制+mfc+vc 如题。 屏幕录像模块程序设计 如题。 屏幕录像源代码 如题。 屏幕小精灵 如题。 七彩泡泡屏保代码 如题。 轻松实现类VC界面 两个窗口的实现类是从CControlBar派生出来的,我们并不需要从头到尾实现该类,因为Cristi Posea先生已经为我们实现了一个称为CSizingControlBar的类,而且做得相当完美!我们所要做的便是好好地利用该类,为了尽可能地简洁,笔者将CSizingControlBar类修改了一下并命名为CCoolBar,接下来我们将详细介绍如何利用该类实现我们所需的界面。 全屏幕播放AVI文件的启动界面程序 如题。 全屏幕播放flash的动画启动界面 如题。 任务栏终级编程 如题。 三种方法来检索处理器信息 获取CPU的信息,以及判断是否支持MMX SSE SSE2 3DNOW等等操作。 深入解剖远程管理软件编写 教程,如题。 深入解析ATL(第二版)源代码资源大小 附带书籍源码。 深入体验VC开发源码 附带书籍源码。 十进制、十六进制、二进制互相转换的VC++程序 如题。 实现DLL拦截 在windows下当一个可执行文件运行时,Windows加载器将可执行模块映射到进程的地址空间中,加载器分析可执行模块的输入表,并设法找出任何需要的DLL,并将它们映射到进程的地址空间中。由于输入表是根据DLL名来进行查找,首先是查找当前目录下有没这文件,没有话在去查找系统目录C:\\Windows\\system32有没这文件,所以我们可以完全趁这个机会去劫持DLL,把他劫持下来后就可以在里面进行我们要做的事情。 实现DLL内存补丁,DLL劫持技术([Symanli原创]) 同上。 实现EDIT控件自绘 如题。 使用VC编写的文件加解密操作类 自定义封装了一个文件加解密类,对文件加解密。lzari.c提供了lzari压缩算法的实现。 视频+语音+播放器源代码(不断更新内容) H.323 开发包与源码、P2P视频技术源码、TopPlayerSrc、VOD核心源码、大型多媒体视频会议服务器端和客户端源码、屏幕截取制作avi的源代码、视频会议系统、视频聊天源代码、优秀的IP网络语音通讯软件Speak Fleely源代码。源码与上面的有些重复。 手机远控电脑源码 分两个模式:一个是短信模式,一个浏览器模式。只要你遵循数据包的格式发送数据就一定可以成功的。不过不是源码。 手写输入法源码 太简单的实例。有利于对输入法开发的入门和深入学习。 鼠标钩子 钩子的实现。如题。 完全自绘软件更换皮肤例子 如题。 完整源码 统计后台([源码信息] 梦者 绿色下载器 流量商必备 ) 本统计后台无须安装数据库。可直接使用。 可多用户登录,多用户统计,顶级防刷,一键扣量,等等强大功能。 count.asp -- 统计页面 conn.asp -- 里面有惊喜哦..想扣量 赶紧用记事本打开看看哦.有详细说明. user.asp -- 用户登录页面 admin\admin_login_welcome.asp -- 管理员登录页面 默认: admin 密码: xiaobing 网络电视软件源码 如题。 网络电台收听助手V3.0(VC源码) 如题。 文件(文件夹)加密解密工具源码 源码实现了主要功能:1 文件(夹)加密解密 2 文件夹伪装保护解除伪装 3 右键关联加密解密到系统菜单 4 开机最小化启动到托盘(气球提示) 5 支持文件(文件夹)拖动 6 支持WIN2000,XP,VISTA,WIN7。非常好的一个实例。 文件加密程序 自绘了很多控件,使用了多线程加密以及解密,支持换肤,非常好的一个实例。详细见源码啦。 文件夹加密小程序 简单的加密源码。 文件捆绑器源代码 文件操作的实例,主要功能在BindFileDlg。 文字图象识别OCR系统开发包 引用了第三方库OcrWencui.lib 来识别。 显示网络流量 监听了端口显示了网络流量,使用了绘图显示了出来。学习流量监控的好例子。是使用了自绘按钮实现的。 线程池的一种实现 如题。 相当不错的一个挂机锁 同上。 写日志log的类 封装了一个类Log,使用它输出信息。 循序渐进实现仿QQ界面 六个步骤实现了QQ类似界面、仿QQ界面上的各种自绘控件。 迅雷资源搜索 如题。 阳历阴历转换 封装了一个CLunar实现阳历阴历转换。 一个服务端只有7k大小的后门 RegOpenKeyEx和RegCreateKeyEx函数由于电脑经常会关闭,或者应用程序也会经常关闭,但有一些参数是经常需要保存。比如当你打开程序,并设置了窗口的大小,想每次打开时都设置窗口为上次打开的大小。这样就需要保存窗口的大小,那么窗口大小的参数保存到那里呢?其实在Windows里最方便的做法,就是保存到注册表里。又比如游戏登录时,总是想保存最后一个登录的用户,那么也需要保存这个用户到注册表里。其实注册表是Windows保存系统配置的数据库,比如不同的语言设置,不同的时区设置,不同的用户登录,不同的权限等等。下面就来学习怎么样使用函数RegOpenKeyEx来打开注册表里的键和用函数RegCreateKeyEx来创建新的键。 一个可以获取硬件信息源代码 如题。 一个轻量级网络通信开发库源码 如题。 音乐播放器 如题。 音频录入mfc源码 如题。 用C写的播放器,超强 引用了libmad库、ogg库、Zlib库等等,强烈推荐学习。 优美菜单 自绘右键菜单。 在ToolBar上添加控件 在工具栏上添加COMBOBOX,EditBox,ProgressCtrl,Slider控件,根据相同的道理您还可以添加其他控件复选框、单选按钮等等 注册表监控程序 该程序的作用是记录系统发生的注册表操作,(只记录成功的,忽略失败的) 自己动手写操作系统 书籍。 自由更改文件对话框的外观 自绘对话框。 应用程序与驱动通信(DeviceIoControl ) 这是教程。 VC++系统开发实例精粹 光驱控制程序、枚举当前所有窗体、硬件信息查看器、注册表操作程序、USB编程、目录浏览器、资源管理器、二进制浏览器、日历管理器、字体设置对话框、任意形状窗体、自动停靠窗体、带图像的下拉列表框、实时曲线显示、OutLooK风格界面、屏幕保护系统、MP3播放器、MIDI音乐演奏器、VFW视频捕捉系统、256色转换灰度图、对比度拉伸、二值化变换、反色、亮度增减、取对数、取指数、直方图均衡、灰度均衡、阈值变换、图像镜像、图像平移、图像缩放、图像旋转、高斯平滑、均值滤波、拉普拉斯边缘检测、梯度锐化、中值滤波、离散余弦变换、傅立叶变换、Walsh变换、方块编码、图像细化、Canny算子提取边缘、Hough变换、逆滤波处理、维纳滤波处理、文字、图像特效显示、带预览的图像选择框、图像浏览器、聊天室、CRC循环冗余检测、ICMP系统、能够发送附件的邮件程序、获取多个IP地址、获取计算机基本网络设置、获取计算机安装的各种网络协议、远程监控系统、FTP客户端、类似MSN的即时通信工具、文件共享系统、考试成绩管理系统、学生管理信息系统、二进制数据库编程、多线程实例、动态链接库(DLL)实例、消息循环重载实例、进程查看程序、文件关联实例、剪贴板查看器、键盘发声系统、运行后自销毁的程序、文件查找系统 、屏幕拷贝实例、文件分割器、密码探测器、带微调和滑动条控件的工具栏、透明窗体实例、状态栏动画、圆盘式和数字式时钟实例、Windows XP风格菜单、 Office XP风格菜单、Windows XP风格标题栏、Windows XP风格对话框、Windows XP风格按钮和滚动条、基于DirectSound的声音播放器、AVI视频制作实例、电影播放器、仿Winamp多媒体播放器、BMP图片浏览器、小波算法的VC++实现、基因算法的VC++实现、细胞识别统计系统、基于神经网络的文字识别系统、车牌定位与识别系统、点对点文件传输、Sniff网络嗅探器、基于UDP的网段扫描器、网络流量监控系统、网络语音电话、HTTP服务器实例、数据库浏览器、数据库查询器、报表打印实例、课程管理信息系统、库存管理信息系统、医院管理信息系统。 ----------VC系统开发项目 VC++餐厅餐饮管理系统 这是一个毕业课程设计,含论文,简单明了,全部引用了MFC控件实现,主要是操作数据库的部分。 VC++开发的仓库管理系统设计文档和源码 如题,含论文,简单明了,全部引用了MFC控件实现,主要是操作数据库的部分。 VC++库存管理系统(毕业设计) 如题,含论文,简单明了,全部引用了MFC控件实现,主要是操作Access数据库的部分。 VC++图书管理系统完整版 一个简单的客户端操作数据库的程序。 餐饮管理系统(全程开发) 同下。有测试部分。 餐饮管理系统 如题,简单。 超市进销存管理系统 基本功能:前台销售结帐、基本信息管理、基本信息查询、日结查询、超市小票打印。操作ORACLE数据库。 局域网监控系统 主要功能:系统采用人机交互的方式,界面美观友好、屏幕信息需要时时显示,网络延时不能大于1秒、服务器端可以随时运行,只要客户端运行,就能够显示屏幕信息、系统运行时占用内存不能大于10MB,以免影响系统性能、客户端运行时需要隐藏显示窗口,起其感觉不到在运行。 库存管理信息系统 在运行系统前,首先要安装SQL Server数据库,注意要设定用户名为“sa”,密码为空。 可以有两种方法创建该数据库:1.使用SQL server查询分析器运行Database目录下的sql.txt中的sql语句,这样会创建stock数据库。2.使用SQL Server的企业管理器直接附加“附加数据库文件”目录下的Stock.mdf文件。系统默认帐号:admin 密码:888888 企业办公管理系统 这个源码不错,自定义了很多类,适合学习。 企业电话语音录音管理系统 主要功能:采用人机对话的操作方式,界面设计美观友好、操作灵活、方便、快捷、准确、数据存储安全可靠。系统可以进行来电显示和来电接听等功能。提供电话拨出功能,可以通过程序拨出电话。提供客户管理功能,记录客户信息,并可以在拨出电话时以电话簿的形式显示客户信息。提供电话录音功能,当电话接通时开始录音,当电话挂断时结束录音。提供录音管理功能,可以通过程序修改录音文件的存储位置。系统最大限度地实现了易维护性和易操作性。系统运行稳定、安全可靠。适合学习。 企业短信群发管理系统 主要功能:电话簿管理。常用语管理。短信息发送。短信息接收。短信猫设置。不过使用了第三方库实现发送接受等功能。 人力资源管理系统 主要功能:系统界面设计美观、友好;智能化程度高、操作灵活、方便;系统运行稳定、安全可靠;反应快速、计算准确;实现新员工入职登记、查询修改及入职合同的录入、编辑;登记并可以浏览日常考勤信息;记录公司定期的员工考核成绩;实现部门用人申请的登记;实现应聘者信息备档;实现工资单自动录入及缺勤原因的扣资计算。 社区视频监控系统 本程序有三个实例,msado15(数据库)、Autodlg(操作文件)、Capture(主要的程序)。本实例是天敏VC4000监控卡,其中使用了MPG4c32.dll、MediaTransmit.dll、MediaTransmit.lib、MediaTransmit.h、Sa7134Capture.dll、Sa7134Capture.lib和Sa7134Capture.h几个文件,在运行程序前,需要将这些文件添加到当前工程中。程序中没有提供这些文件。 图书管理系统 如题。 物流综合管理系统VC源码+毕业设计 如题。 学生管理系统 如题。 学生考试系统 如题。

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧