锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
緗戜笂鏌ラ槄浜嗕竴浜涜祫鏂?br>1銆?a class=headermaintitle id=ctl00___ctl00___ctl00_ctl00_bcr_bth___BlogTitle minmax_bound="true">Windows CE Networking Team WebLog 榪欐槸緗戠粶緇勭殑涓涓崥瀹?br>ttp://blogs.msdn.com/cenet/archive/tags/Author_3A00_+Adam+Dyba/default.aspx
2銆丠ow Connection Manager Connects
http://msdn.microsoft.com/en-us/magazine/dd263096.aspx
浠栦滑閮藉Connection Manager鐔熸?zhèn)夊Q屼絾鏄浉鍏崇殑鏂囩珷涓茍娌℃湁鎻愬強(qiáng)榪欎簺銆?br>
鎵浠ヨ繕鍦ㄥ鎵句腑銆傘傘?/p>
]]>
google浜嗕竴涓嬶紝鍏跺疄榪樻槸寰堢硦娑傘?br>鍦ㄣ奧idget鏄粈涔堬紵銆嬩腑錛屼綔鑰呰“widget"”(鍜孯SS涓鏍鳳紝娌℃湁涓枃鍚嶇殑Web 2.0浜х墿錛夛細(xì)鍙互鏄竴涓浘鍍忓浘鍍忕殑閮ㄤ歡錛堝皬鎻掍歡錛夛紝涔熷彲浠ユ槸鍥懼艦鑳屽悗鐨勪竴孌電▼搴忥紝鍙互宓屽湪鎵嬫満銆佺綉欏靛拰鍏朵粬浜烘満浜や簰鐨勭晫闈?渚嬪鐢?shù)鑴戞闈㈠Q変笂錛屽叾鐩殑鏄細(xì)1錛夊府鍔╃敤鎴蜂韓鐢ㄥ悇縐嶅簲鐢ㄧ▼搴忓拰緗戠粶鏈嶅姟錛圛nternet services錛夛紝2錛夋柟渚垮揩鎹鳳紱3錛夊ソ鐜╋紝閫熷害蹇?br>鍦ㄣ婁粈涔堟槸widget錛焪idget鏄粈涔堟剰鎬濓紵銆嬫枃涓紝 Widget-鍚嶈瘝鈥斺憼涓涓皬鏈烘璁懼錛屽鐞冨艦鏌勬垨鑰呭紑鍏寵緗紝鐗瑰埆鏄竴浜涙病鏈夋垨鑰呮兂涓嶈搗鍏蜂綋鍚嶇О鐨勭墿鍝併侴adget錛堟柊濂囩殑灝忕帺鎰忥級錛氬湪浠櫒鏉夸笂涓鎺掔殑widgets銆傗憽鍦ㄧ敤鎴風(fēng)殑鍥懼艦鐣岄潰涓婏紝涓轟簡瀹炵幇涓涓叿浣撶殑鍔熻兘錛堜緥濡傚嵎杞存垨鑰呮寜閽級鑰屼嬌鐢ㄧ殑緋誨垪鍥懼艦絎﹀彿鍜岀▼搴忎唬鐮併傗憿涓烘煇欏逛換鍔$壒瀹氱殑璁懼鎴栬呮搷綰佃緗?-閫氬父鎻愪緵鍖呭惈璁懼畾妯″紡鑰岃涓轟竴鑷寸殑甯哥敤鐨剋idgets鐨剋idget搴撱?br>
鎰熻widget鏄竴涓緢涓у寲鐨勪笢瑗匡紝鎴栬呭緢灝忥紝浣嗘槸寰堟柟渚匡紝寰堝ソ鐜┿傚彲浠ュソ濂藉涔?fàn)涓涓嬨?br>
寮曠敤錛?br>1銆乄idget鏄粈涔堬紵
http://blog.vsharing.com/Grigo/A572418.html
2銆佷粈涔堟槸widget錛焪idget鏄粈涔堟剰鎬濓紵
http://info.codepub.com/2008/06/info-19918.html
3銆乄idget Anatomy-The Manifest
http://windowsteamblog.com/blogs/windowsphone/archive/2009/08/12/widget-anatomy-the-manifest.aspx
4銆丮obile Widget 鏄粈涔堬紵
http://www.mtrend.net.cn/bbs/viewthread.php?tid=3351
銆銆寮傛鏂瑰紡鎸囩殑鏄彂閫佹柟涓嶇瓑鎺ユ敹鏂瑰搷搴旓紝渚挎帴鐫鍙戜笅涓暟鎹寘鐨勯氫俊鏂瑰紡錛涜屽悓姝ユ寚鍙戦佹柟鍙戝嚭鏁版嵁鍚庯紝絳夋敹鍒版帴鏀舵柟鍙戝洖鐨勫搷搴旓紝鎵嶅彂涓嬩竴涓暟鎹寘鐨勯氫俊鏂瑰紡銆?br>
銆銆闃誨濂楁帴瀛楁槸鎸囨墽琛屾濂楁帴瀛楃殑緗戠粶璋冪敤鏃訛紝鐩村埌鎴愬姛鎵嶈繑鍥烇紝鍚﹀垯涓鐩撮樆濉炲湪姝ょ綉緇滆皟鐢ㄤ笂錛屾瘮濡傝皟鐢╮ecv()鍑芥暟璇誨彇緗戠粶緙撳啿鍖轟腑鐨勬暟鎹紝濡傛灉娌℃湁鏁版嵁鍒拌揪錛屽皢涓鐩存寕鍦╮ecv()榪欎釜鍑芥暟璋冪敤涓婏紝鐩村埌璇誨埌涓浜涙暟鎹紝姝ゅ嚱鏁拌皟鐢ㄦ墠榪斿洖錛涜岄潪闃誨濂楁帴瀛楁槸鎸囨墽琛屾濂楁帴瀛楃殑緗戠粶璋冪敤鏃訛紝涓嶇鏄惁鎵ц鎴愬姛錛岄兘绔嬪嵆榪斿洖銆傛瘮濡傝皟鐢╮ecv()鍑芥暟璇誨彇緗戠粶緙撳啿鍖轟腑鏁版嵁錛屼笉綆℃槸鍚﹁鍒版暟鎹兘绔嬪嵆榪斿洖錛岃屼笉浼?xì)涓鐩存寕鍦ㄦ鍑芥暟璋冪敤涓娿傚湪瀹為檯Windows緗戠粶閫氫俊杞歡寮鍙戜腑錛屽紓姝ラ潪闃誨濂楁帴瀛楁槸鐢ㄧ殑鏈澶氱殑銆傚鉤甯告墍璇寸殑C/S錛堝鎴風(fēng)/鏈嶅姟鍣級緇撴瀯鐨勮蔣浠跺氨鏄紓姝ラ潪闃誨妯″紡鐨勩?br>
銆銆瀵逛簬榪欎簺姒傚康錛屽垵瀛﹁呯殑鐞嗚В涔熻鍙兘浼兼槸鑰岄潪錛屾垜灝嗙敤涓涓渶綆鍗曠殑渚嬪瓙璇存槑寮傛闈為樆濉濻ocket鐨勫熀鏈師鐞嗗拰宸ヤ綔鏈哄埗銆傜洰鐨勬槸璁╁垵瀛﹁呬笉浠呭Socket寮傛闈為樆濉炵殑姒傚康鏈変釜闈炲父閫忓交鐨勭悊瑙o紝鑰屼笖涔熺粰浠栦滑鎻愪緵涓涓敤Socket寮鍙戠綉緇滈氫俊搴旂敤紼嬪簭鐨勫揩閫熷叆闂ㄦ柟娉曘傛搷浣滅郴緇熸槸Windows 98錛堟垨NT4.0錛夛紝寮鍙戝伐鍏鋒槸Visual C++6.0銆?br>
銆銆MFC鎻愪緵浜嗕竴涓紓姝ョ被CAsyncSocket錛屽畠?yōu)畞瑁呬簡寮傛銆侀潪闃誨Socket鐨勫熀鏈姛鑳斤紝鐢ㄥ畠鍋氬父鐢ㄧ殑緗戠粶閫氫俊杞歡寰堟柟渚褲備絾瀹冨睆钄戒簡Socket鐨勫紓姝ャ侀潪闃誨絳夋蹇碉紝寮鍙戜漢鍛樻棤闇浜嗚В寮傛銆侀潪闃誨Socket鐨勫師鐞嗗拰宸ヤ綔鏈哄埗銆傚洜姝わ紝寤鴻鍒濆鑰呭涔?fàn)缂柧|戠粶閫氫俊紼嬪簭鏃訛紝鏆備笖涓嶈鐢∕FC鎻愪緵鐨勭被錛岃屽厛鐢╓insock2 API錛岃繖鏍鋒湁鍔╀簬瀵瑰紓姝ャ侀潪闃誨Socket緙栫▼鏈哄埗鐨勭悊瑙c?br>
銆銆涓轟簡綆鍗曡搗瑙侊紝鏈嶅姟鍣ㄧ鍜屽鎴風(fēng)鐨勫簲鐢ㄧ▼搴忓潎鏄熀浜嶮FC鐨勬爣鍑嗗璇濇錛岀綉緇滈氫俊閮ㄥ垎鍩轟簬Winsock2 API瀹炵幇銆?br>銆銆鍏堝仛鏈嶅姟鍣ㄧ搴旂敤紼嬪簭銆?br>銆銆鐢∕FC鍚戝鍋氫竴涓熀浜庡璇濇鐨勫簲鐢ㄧ▼搴廠ocketSever錛屾敞鎰忕涓夋涓笉瑕侀変笂Windwos Sockets閫夐」銆傚湪鍋氬ソ宸ョ▼鍚庯紝鍒涘緩涓涓猄everSock錛屽皢瀹冭緗負(fù)寮傛闈為樆濉炴ā寮忥紝騫朵負(fù)瀹冩敞鍐屽悇縐嶇綉緇滃紓姝ヤ簨浠訛紝鐒跺悗涓庤嚜瀹氫箟鐨勭綉緇滃紓姝ヤ簨浠惰仈緋諱笂錛屾渶鍚庤繕瑕佸皢瀹冭緗負(fù)鐩戝惉妯″紡銆傚湪鑷畾涔夌殑緗戠粶寮傛浜嬩歡鐨勫洖璋冨嚱鏁頒腑錛屼綘鍙互寰楀埌鍚勭緗戠粶寮傛浜嬩歡錛屾牴鎹畠浠殑綾誨瀷錛屽仛涓嶅悓鐨勫鐞嗐備笅闈㈠皢璇︾粏浠嬬粛濡備綍緙栧啓鐩稿叧浠g爜銆?br>銆銆鍦⊿ocketSeverDlg.h鏂囦歡鐨勭被瀹氫箟涔嬪墠澧炲姞濡備笅瀹氫箟錛?br>
#define NETWORK_EVENT WM_USER+166 file://瀹氫箟緗戠粶浜嬩歡
SOCKET ServerSock; file://鏈嶅姟鍣ㄧSocket
鍦ㄧ被瀹氫箟涓鍔犲涓嬪畾涔夛細(xì)
class CSocketSeverDlg : CDialog
{
public:
SOCKET ClientSock[CLNT_MAX_NUM]; file://瀛樺偍涓庡鎴風(fēng)閫氫俊鐨凷ocket鐨勬暟緇?/font>
/*鍚勭緗戠粶寮傛浜嬩歡鐨勫鐞嗗嚱鏁?/
void OnClose(SOCKET CurSock); file://瀵圭Socket鏂紑
void OnSend(SOCKET CurSock); file://鍙戦佺綉緇滄暟鎹寘
void OnReceive(SOCKET CurSock); file://緗戠粶鏁版嵁鍖呭埌杈?br> void OnAccept(SOCKET CurSock); file://瀹㈡埛绔繛鎺ヨ姹?/font>
BOOL InitNetwork(); file://鍒濆鍖栫綉緇滃嚱鏁?br> void OnNetEvent(WPARAM wParam, LPARAM lParam); file://寮傛浜嬩歡鍥炶皟鍑芥暟
…
};
鍦⊿ocketSeverDlg.cpp鏂囦歡涓鍔犳秷鎭槧灝勶紝鍏朵腑OnNetEvent鏄紓姝ヤ簨浠跺洖璋冨嚱鏁板悕錛?/font>
ON_MESSAGE(NETWORK_EVENT,OnNetEvent)
瀹氫箟鍒濆鍖栫綉緇滃嚱鏁幫紝鍦⊿ocketSeverDlg.cpp鏂囦歡鐨凮nInitDialog錛堬級涓皟姝ゅ嚱鏁板嵆鍙?/font>
BOOL CSocketSeverDlg::InitNetwork()
{
WSADATA wsaData;
//鍒濆鍖朤CP鍗忚
BOOL ret = WSAStartup(MAKEWORD(2,2), &wsaData);
if(ret != 0)
{
MessageBox('鍒濆鍖栫綉緇滃崗璁け璐?');
return FALSE;
}
//鍒涘緩鏈嶅姟鍣ㄧ濂楁帴瀛?br> ServerSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(ServerSock == INVALID_SOCKET)
{
MessageBox('鍒涘緩濂楁帴瀛楀け璐?');
closesocket(ServerSock);
WSACleanup();
return FALSE;
}
//緇戝畾鍒版湰鍦頒竴涓鍙d笂
sockaddr_in localaddr;
localaddr.sin_family = AF_INET;
localaddr.sin_port = htons(8888); //绔彛鍙蜂笉瑕佷笌鍏朵粬搴旂敤紼嬪簭鍐茬獊
localaddr.sin_addr.s_addr = 0;
if(bind(ServerSock ,(struct sockaddr*)&localaddr,sizeof(sockaddr))
= = SOCKET_ERROR)
{
MessageBox('緇戝畾鍦板潃澶辮觸!');
closesocket(ServerSock);
WSACleanup();
return FALSE;
}
//灝哠everSock璁劇疆涓哄紓姝ラ潪闃誨妯″紡錛屽茍涓哄畠娉ㄥ唽鍚勭緗戠粶寮傛浜嬩歡錛屽叾涓璵_hWnd
//涓哄簲鐢ㄧ▼搴忕殑涓誨璇濇鎴栦富紿楀彛鐨勫彞鏌?br> if(WSAAsyncSelect(ServerSock, m_hWnd, NETWORK_EVENT, FD_ACCEPT | FD_CLOSE | FD_READ | FD_WRITE) == SOCKET_ERROR)
{
MessageBox('娉ㄥ唽緗戠粶寮傛浜嬩歡澶辮觸!');
WSACleanup();
return FALSE;
}
listen(ServerSock, 5); file://璁劇疆渚﹀惉妯″紡
return TRUE;
}
涓嬮潰瀹氫箟緗戠粶寮傛浜嬩歡鐨勫洖璋冨嚱鏁?/font>
void CSocketSeverDlg::OnNetEvent(WPARAM wParam, LPARAM lParam)
{
//璋冪敤Winsock API鍑芥暟錛屽緱鍒扮綉緇滀簨浠剁被鍨?br> int iEvent = WSAGETSELECTEVENT(lParam);
//璋冪敤Winsock API鍑芥暟錛屽緱鍒板彂鐢熸浜嬩歡鐨勫鎴風(fēng)濂楁帴瀛?br> SOCKET CurSock= (SOCKET)wParam;
switch(iEvent)
{
case FD_ACCEPT: //瀹㈡埛绔繛鎺ヨ姹備簨浠?br> OnAccept(CurSock);
break;
case FD_CLOSE: //瀹㈡埛绔柇寮浜嬩歡:
OnClose(CurSock);
break;
case FD_READ: //緗戠粶鏁版嵁鍖呭埌杈句簨浠?br> OnReceive(CurSock);
break;
case FD_WRITE: //鍙戦佺綉緇滄暟鎹簨浠?br> OnSend(CurSock);
break;
default: break;
}
}
銆銆浠ヤ笅鏄彂鐢熷湪鐩稿簲Socket涓婄殑鍚勭緗戠粶寮傛浜嬩歡鐨勫鐞嗗嚱鏁幫紝鍏朵腑OnAccept浼犺繘鏉ョ殑鍙傛暟鏄湇鍔″櫒绔垱寤虹殑濂楁帴瀛楋紝OnClose()銆丱nReceive()鍜孫nSend()浼犺繘鏉ョ殑鍙傛暟鍧囨槸鏈嶅姟鍣ㄧ鍦ㄦ帴鍙楀鎴風(fēng)榪炴帴鏃舵柊鍒涘緩鐨勭敤涓庢瀹㈡埛绔氫俊鐨凷ocket銆?br>void CSocketSeverDlg::OnAccept(SOCKET CurSock)
{
//鎺ュ彈榪炴帴璇鋒眰錛屽茍淇濆瓨涓庡彂璧瘋繛鎺ヨ姹傜殑瀹㈡埛绔繘琛岄氫俊Socket
//涓烘柊鐨剆ocket娉ㄥ唽寮傛浜嬩歡錛屾敞鎰忔病鏈堿ccept浜嬩歡
}
void CSocketSeverDlg::OnClose(SOCET CurSock)
{
//緇撴潫涓庣浉搴旂殑瀹㈡埛绔殑閫氫俊錛岄噴鏀劇浉搴旇祫婧?br>}
void CSocketSeverDlg::OnSend(SOCET CurSock)
{
//鍦ㄧ粰瀹㈡埛绔彂鏁版嵁鏃跺仛鐩稿叧棰勫鐞?br>}
void CSocketSeverDlg::OnReceive(SOCET CurSock)
{
//璇誨嚭緗戠粶緙撳啿鍖轟腑鐨勬暟鎹寘
}
銆銆鐢ㄥ悓鏍風(fēng)殑鏂規(guī)硶寤虹珛涓涓鎴風(fēng)搴旂敤紼嬪簭銆傚垵濮嬪寲緗戠粶閮ㄥ垎錛屼笉闇瑕佸皢濂楁帴瀛楄緗負(fù)鐩戝惉妯″紡銆傛敞鍐屽紓姝ヤ簨浠舵椂錛屾病鏈塅D_ACCEPT錛屼絾澧炲姞浜咶D_CONNECT浜嬩歡錛屽洜姝ゆ病鏈塐nAccept()鍑芥暟錛屼絾澧炲姞浜哋nConnect()鍑芥暟銆傚悜鏈嶅姟鍣ㄥ彂鍑鴻繛鎺ヨ姹傛椂錛屼嬌鐢╟onnect()鍑芥暟錛岃繛鎺ユ垚鍔熷悗錛屼細(xì)鍝嶅簲鍒癘nConnect()鍑芥暟涓備笅闈㈡槸OnConnect()鍑芥暟鐨勫畾涔夛紝浼犺繘鏉ョ殑鍙傛暟鏄鎴風(fēng)Socket鍜屾湇鍔″櫒绔彂鍥炴潵鐨勮繛鎺ユ槸鍚︽垚鍔熺殑鏍囧織銆?br>void CSocketClntDlg::OnConnect(SOCKET CurSock, int error)
{
if(0 = = error)
{
if(CurSock = = ClntSock)
MessageBox('榪炴帴鏈嶅姟鍣ㄦ垚鍔?');
}
}
銆銆瀹氫箟OnReceive()鍑芥暟錛屽鐞嗙綉緇滄暟鎹埌杈句簨浠?
銆銆瀹氫箟OnSend()鍑芥暟錛屽鐞嗗彂閫佺綉緇滄暟鎹簨浠?
銆銆瀹氫箟OnClose()鍑芥暟錛屽鐞嗘湇鍔″櫒鐨勫叧闂簨浠躲?br>
銆銆浠ヤ笂灝辨槸鐢ㄥ熀浜嶹indows娑堟伅鏈哄埗鐨勫紓姝/O妯″瀷鍋氭湇鍔″櫒鍜屽鎴風(fēng)搴旂敤紼嬪簭鐨勫熀鏈柟娉曘傚彟澶栬繕鍙互鐢ㄤ簨浠舵ā鍨嬨侀噸鍙犳ā鍨嬫垨瀹屾垚绔彛妯″瀷錛岃鑰呭彲浠ュ弬鑰冩湁鍏充功綾嶃?br>銆銆鍦ㄥ疄鐜頒簡涓婇潰鐨勪緥瀛愬悗錛屼綘灝嗗Winsock緙栫綉緇滈氫俊紼嬪簭鐨勬満鍒舵湁浜嗕竴瀹氱殑浜嗚В銆傛帴涓嬫潵浣犲彲浠ヨ繘琛屾洿綺懼僵鐨勭紪紼? 涓嶄粎鍙互鍦ㄧ綉涓婁紶杈撴櫘閫氭暟鎹紝鑰屼笖榪樹互浼犺緭璇煶銆佽棰戞暟鎹紝浣犺繕鍙互鑷繁鍋氫竴涓綉緇滆祫婧愬叡浜殑鏈嶅姟鍣ㄨ蔣浠訛紝鍜屼綘鐨勫悓瀛﹀湪瀹為獙瀹ょ殑灞鍩熺綉閲屽彲浠ュ叡鍚屽垎浜綘鐨勬垚鏋溿?/font>
鍚屾鏈嶅姟鍣ㄥ鎺ュ瓧鎸傝搗搴旂敤紼嬪簭鐨勬墽琛岋紝鐩村埌濂楁帴瀛椾笂鎺ユ敹鍒拌繛鎺ヨ姹傘傚悓姝ユ湇鍔″櫒濂楁帴瀛椾笉閫傜敤浜庡湪鎿嶄綔涓ぇ閲忎嬌鐢ㄧ綉緇滅殑搴旂敤紼嬪簭錛屼絾瀹冧滑鍙兘閫傜敤浜庣畝鍗曠殑緗戠粶搴旂敤紼嬪簭銆備嬌鐢?Bind 鍜?Listen 鏂規(guī)硶璁劇疆 Socket 浠ュ湪緇堢粨鐐逛笂渚﹀惉涔嬪悗錛孲ocket 灝卞彲浠ラ殢鏃朵嬌鐢?Accept 鏂規(guī)硶鎺ュ彈浼犲叆鐨勮繛鎺ヨ姹備簡銆傚簲鐢ㄧ▼搴忚鎸傝搗錛岀洿鍒拌皟鐢?Accept 鏂規(guī)硶鏃舵帴鏀跺埌榪炴帴璇鋒眰銆?/p>
鎺ユ敹鍒拌繛鎺ヨ姹傛椂錛孉ccept 榪斿洖涓涓笌榪炴帴瀹㈡埛绔叧鑱旂殑鏂?Socket 瀹炰緥銆備笅闈㈢殑紺轟緥璇誨彇瀹㈡埛绔暟鎹紝鍦ㄦ帶鍒跺彴涓婃樉紺鴻鏁版嵁錛岀劧鍚庡皢璇ユ暟鎹洖鏄懼埌瀹㈡埛绔係ocket 涓嶆寚瀹氫換浣曟秷鎭崗璁紝鍥犳瀛楃涓?#8220;<EOF>”鏍囪娑堟伅鏁版嵁鐨勭粨灝俱傚畠鍋囧畾涓涓悕涓?鐨?Socket 宸插垵濮嬪寲錛屽茍緇戝畾鍒頒竴涓粓緇撶偣銆?/p>
Console.WriteLine("Waiting for a connection...");
Socket handler = listener.Accept();
String data = null;
while (true) {
bytes = new byte[1024];
int bytesRec = handler.Receive(bytes);
data += Encoding.ASCII.GetString(bytes,0,bytesRec);
if (data.IndexOf("<EOF>") > -1) {
break;
}
}
Console.WriteLine( "Text received : {0}", data);
byte[] msg = Encoding.ASCII.GetBytes(data);
handler.Send(msg);
handler.Shutdown(SocketShutdown.Both);
handler.Close();
msdn瀹樻柟璇存槑:http://msdn2.microsoft.com/zh-cn/library/80z2essb(VS.80).aspx