博文
枚举系统安装的所有协议(2010-07-31 00:29:00)
摘要:// EnumProtocol.cpp : 定义控制台应用程序的入口点。
//
// Get Procotol installed in os
// code @ VS2005
// by lym
#include "stdafx.h"
#include <iostream>
#include <Winsock2.h>
using namespace std;
#pragma comment(lib, "Ws2_32")
int _tmain(int argc, _TCHAR* argv[])
{
WSADATA wsd;
DWORD dwSize=0;
WSAPROTOCOL_INFO* lpWsaprotocolInfo=NULL;
int ret, i;
// Load Winsock
//
if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)
&nbs......
网络编程 同步,阻塞,异步,非阻塞(2010-05-23 21:32:00)
摘要:网络编程之同步,阻塞,异步,非阻塞 同步:函数没有执行完不返回,线程被挂起 阻塞:没有收完数据函数不返回,线程也被挂起异步:函数立即返回,通过事件或是信号通知调用者非阻塞:函数立即返回,通过select通知调用者这样看来异步和非阻塞有什么区别呢?异步=非阻塞?同步是在操作系统层面上,阻塞是在套接字上 Reactor是同步 Proactor是异步?回答:同步、异步、阻塞和非阻塞的概念在进行网络编程时,我们常常见到同步、异步、阻塞和非阻塞四种调用方式。这些方式彼此概念并不好理解。下面是我对这些术语的理解。同步
所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回。按照这个定义,其实绝大多数函数都是同步调用(例如sin, isdigit等)。但是一般而言,我们在说同步、异步的时候,特指那些需要其他部件协作或者需要一定时间完成的任务。最常见的例子就是 SendMessage。该函数发送一个消息给某个窗口,在对方处理完消息之前,这个函数不返回。当对方处理完毕以后,该函数才把消息处理函数所返回的 LRESULT值返回给调用者。异步
异步的概念和同步相对。当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者。以 CAsycSocket类为例(注意,CSocket从CAsyncSocket派生,但是起功能已经由异步转化为同步),当一个客户端通过调用 Connect函数发出一个连接请求后,调用者线程立刻可以朝下运行。当连接真正建立起来以后,socket底层会发送一个消息通知该对象。这里提到执行 部件和调用者通过三种途径返回结果:状态、通知和回调。可以使用哪一种依赖于执行部件的实现,除非执行部件提供多种选择,否则不受调用者控制。如果执行部 件用状态来通知,那么调用者就需要每隔一定时间检查一次,效率就很低(有些初学多线程编程的人,总喜欢用一个循环去检查某个变量的值,这其实是一种很严重 的错误)。如果是使用通知的方式,效率则很高,因为执行部件几乎不需要做额外的操作。至于回调函数,其实和通知没太多区别。阻塞
阅读全文(1917) | 评论:0
VC获取本机MAC地址(2010-05-14 21:37:00)
摘要:#include <windows.h>#include <iostream>#include <stdio.h>#include "Iphlpapi.h"
#pragma comment(lib,"Iphlpapi")#pragma comment(lib,"WS2_32")
using namespace std;u_char g_ucLocalMac[6];DWORD g_dwGatewayIP;DWORD g_dwLocalIP;DWORD g_dwMask;
BOOL GetGlobalData(){ ZeroMemory(g_ucLocalMac,6); PIP_ADAPTER_INFO pAdapterInfo=NULL; ULONG ulLen=0; //为适配器结构申请内存 ::GetAdaptersInfo(pAdapterInfo,&ulLen); pAdapterInfo=(PIP_ADAPTER_INFO)::GlobalAlloc(GPTR,ulLen); //获取本地适配器结构信息 if(::GetAdaptersInfo(pAdapterInfo,&ulLen) == ERROR_SUCCESS) { if(pAdapterInfo != NULL) { memcpy(g_ucLocalMac, pAdapterInfo->Address, 6); g_dwGatewayIP = ::inet_addr(pAdapterInfo->GatewayList.IpAddress.String); g_dwLocalIP = ::inet_addr(pAdapterInfo->IpAddressList.IpAddress.String); g_dwMask = ::inet_addr(pAdapterInfo->IpAddressList.IpMask.String); } } cout<<"--------------输出本机IP地址----------"<<endl<<endl; in_addr in; in.S_un.S_addr=g_......
C++代码-获取当前工作目录(2010-05-14 21:37:00)
摘要:// dev-c++#include <stdio.h>#include <dir.h>#include <dos.h>
#define MAX_LENGTH 1024
int main(int argc,char* argv){ char buf[MAX_LENGTH]; int idisk = 0; if(NULL != getcwd(buf,MAX_LENGTH)) { printf("work dir: %s\n",buf); } system("PAUSE"); return 0;}......
Building Browser Helper Objects with Vis(2010-04-28 12:07:00)
摘要:Building Browser Helper Objects with Visual Studio 2005
Tony Schreiner, John Sudds
Microsoft Corporation
October 27, 2006
Summary: This article demonstrates how to use Microsoft Visual Studio 2005 to create a simple Browser Helper Object (BHO), a Component Object Model (COM) object that implements the IObjectWithSite interface and attaches itself to Internet Explorer. This article describes how to create an entry-level BHO step-by-step. At first, the BHO displays a message that reads "Hello World!" as Internet Explorer loads a document. Then, the BHO is extended to remove images from the loaded page. This article is written for developers who want to learn how to extend the functionality of the browser and to create Web developer tools for Internet Explorer. (8 printed pages)
Contents
Introduction
Overview
Setting up the Project
Implementing the Basics
Responding to Events
Manipulating the DOM
Summary
Related Topics
Introduction
This article relies on Microsoft......
FAQ 11:如何避免死锁?(2007-12-29 18:20:00)
摘要:FAQ 11:如何避免死锁?
线程A需要资源X,而线程B需要资源Y,而双方都掌握有对方所要的资源,这种情况称为死锁(deadlock),或死亡拥抱(the deadly embrace)。
任何时候当一段代码需要两个或更多资源时,都有潜在性的死锁阴影。死锁的情况可能非常复杂,许多线程的独立性彼此纠缠在一起。虽然有一些算法可以侦测并仲裁死锁状态,基本上它们仍嫌过于复杂。对大部分程序而言,最好的政策就是找出一种方法以确保死锁不会发生。强迫将资源锁定,使它们成为“all-or-nothing”(不要统统获得,要不统统没有) ,可以阻止死锁的发生。......
FAQ 10:如果线程在critical sections中结束会怎么样? (2007-12-29 18:20:00)
摘要:FAQ 10:如果线程在critical sections中结束会怎么样?
critical section的一个缺点就是,没有办法获知进入critical section中的那个线程是生是死。从另一个角度看,由于critical section不是核心对象,如果进入critical section的那个线程结束了或当掉了,而没有调用LeaveCriticalSection()的话,系统没有办法将该critical section清除。如果你需要那样的机能,你应该0
使用mutex。......
FAQ 09:如果线程在Critical sections中停很久会怎么样?(2007-12-29 18:19:00)
摘要:FAQ 09:如果线程在Critical sections中停很久会怎么样?
如果一直让资源被锁定,你就会阻止其他线程的执行,并把整个程序带到一个完全停止的状态。以critical section来说,当某个线程进入critical section时,该项资源即被琐定。
我们很难定义所谓“长时间”是多长。如果你在网络上进行操作,并且是在一个拨号网络上,长时间可能是指数分钟,如果所处理的是应用程序的一项关键性资源,长时间可能是数个毫秒(milliseconds)。
我能够给你的最牢固而立即的警告是:千万不要在一个critical section之中调用sleep()或任何wait...()API函数。
当你以一个同步机制保护一个资源时,有一点必须记住,那就是:这项资源被使用的频率如何?线程必须多快释放这份资源,才能确保整个程序的运行很平顺?
某些人会关心这样的问题:如果我再也不释放资源(或不离开critical section,或不释放mutex……等等),怎么样?答案是:不会怎么样!!
OS不会当掉。用户不会获得任何错误信息。最坏的情况是,当主线程(一个GUI线程)需要使用这被锁定的资源时,程序会挂在那儿,动也不动。真的,同步机制并没有什么神奇魔法。......
FAQ 08:什么是一个被激发的对象?(2007-12-25 15:16:00)
摘要:FAQ 8:什么是一个被激发的对象?
可被WaitForSingleObject()使用的核心对象有两种状态:激发和未激发。WaitForSingleObject()会
在目标物变成激发状态时返回。事实上我们也几乎是以此作为对象激发与否的操作型定义。
当核心对象被激发时,会导致WaitForSingleObject()醒来。
当线程正在执行时,线程对象处于未激发状态。当线程结束时,线程对象就被激发了。因此,任何线
程如果等待的是一个线程对象,将会在等待对象结束时被调用,因为当时线程对象自动变成激发状态。
......
FAQ 07:我如何得知一个核心对象是否处于激发状态?(2007-12-25 15:15:00)
摘要:FAQ 07:我如何得知一个核心对象是否处于激发状态?
关于time-out,有一个特别重要的用途,但是很少被人注意。设定time-out为0,使你能够检查
handle的状态并立刻返回,没有片刻停留。如果handle已经备妥,那么这个函数成功并传回
WAIT_OBJECT_0。否则,这个函数立刻返回并传回WAIT_TIMEOUT。
另有其他的一些理由使你需要设定time-out参数。最简单的一贯饿理由就是你不希望被粘住,特别是
在调试的时候。如果你所等待的线程进入了一个无穷循环,你或许可以根据此函数的返回值以及time-out
终了与否,获得一些警告。
......