freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

基于winsock的網(wǎng)絡(luò)按時(shí)計(jì)費(fèi)系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)論(編輯修改稿)

2025-07-11 16:31 本頁面
 

【文章內(nèi)容簡介】 ,我們就要使用 WSAAsyncSelect()函數(shù),讓系統(tǒng)主動(dòng)來通知我們有客戶端提出連接請求了。該函數(shù)調(diào)用成功返回 0,否則返回 SOCKET_ERROR。 int PASCAL FAR WSAAsyncSelect( SOCKET s, HWND hWnd,unsigned int wMsg, long lEvent )。 參數(shù): s: Socket 對象; hWnd :接收消息的窗口句柄; wMsg:傳給窗口的消息; lEvent:被注冊的網(wǎng)絡(luò)事件,也即是應(yīng)用程序向窗口發(fā)送消息的網(wǎng)路事件,該值為下列值 FD_READ、 FD_WRITE、 FD_OOB、 FD_ACCEPT、 FD_CONNECT、 FD_CLOSE的組合,各個(gè)值的具體含意為 FD_READ:希望在套接字 S收到數(shù)據(jù)時(shí)收到消息; FD_WRITE:希望在套接字 S上可以發(fā)送數(shù)據(jù)時(shí)收到消息; FD_ACCEPT:希望在套接字 S上收到連接請求時(shí)收到消息; FD_CONNECT:希望在套接字 S上連接成功時(shí)收到消息; FD_CLOSE:希望在套接字 S上連接關(guān)閉時(shí)收到消息; FD_OOB:希望在套接字 S上收到帶外數(shù)據(jù)時(shí)收到消息 【 14】 。 具體應(yīng)用時(shí), wMsg應(yīng)是在應(yīng)用程序中定義的消息名稱,而消息結(jié)構(gòu)中的 lParam則為以上各種網(wǎng)絡(luò)事件名稱。所以,可以在窗口處理自定義消息函數(shù)中使用以下結(jié)構(gòu)來響應(yīng)Socket的不同事件: switch(lParam) 14 {case FD_READ: ? break。 case FD_WRITE、 ? break。 ? } 5)服務(wù)器端接受客戶端的連接請求 當(dāng) Client提出連接請求時(shí), Server 端 hwnd視窗會(huì)收到 Winsock Stack送來我們自定義的一個(gè)消息,這時(shí),我們可以分析 lParam,然后調(diào)用相關(guān)的函數(shù)來處理此事件 【 15】 。為了使服務(wù)器端接受客戶端的連接請求,就要使用 accept() 函數(shù),該函數(shù)新建一 Socket與客戶端的 Socket相通,原先監(jiān)聽之 Socket繼續(xù)進(jìn)入監(jiān)聽狀態(tài),等待他人的連接要求。該函數(shù)調(diào)用成功返回一個(gè)新產(chǎn)生的 Socket對象,否則返回 INVALID_SOCKET。 SOCKET PASCAL FAR accept( SCOKET s, struct sockaddr FAR *addr,int FAR *addrlen )。 參數(shù): s: Socket的識別碼; addr:存放來連接的客戶端的地址; addrlen: addr的長度 6)結(jié)束 socket 連接 結(jié)束服務(wù)器和客戶端的通信連接是很簡單的,這一過程可以由服務(wù)器或客戶機(jī)的任一端啟動(dòng),只要調(diào)用 closesocket()就可以了,而要關(guān)閉 Server端監(jiān)聽狀態(tài)的 socket,同樣也是利用此函數(shù)。另外,與程序啟動(dòng)時(shí)調(diào)用 WSAStartup()憨數(shù)相對應(yīng),程式結(jié)束前,需要調(diào)用 WSACleanup() 來通知 Winsock Stack釋放 Socket所占用的資源。這兩個(gè)函數(shù)都是調(diào)用成功返回 0,否則返回 SOCKET_ERROR。 int PASCAL FAR closesocket( SOCKET s )。 參 數(shù): s: Socket 的識別碼; int PASCAL FAR WSACleanup( void )。 參 數(shù): 無 socket()bind()listenaccept()recv()/send()closesocket() 客戶機(jī)方: socket()connect()send()/recv()closesocket() 有鑒于以上幾個(gè)函數(shù)在整個(gè)網(wǎng)絡(luò)編程中的 重要性,有必要結(jié)合程序?qū)嵗龑ζ渥鲚^深入的剖析。服務(wù)器端應(yīng)用程序在使用套接字之前,首先必須擁有一個(gè) Socket,系統(tǒng)調(diào)用socket()函數(shù)向應(yīng)用程序提供創(chuàng)建套接字的手段。該套接字實(shí)際上是在計(jì)算機(jī)中提供了一個(gè)通信埠,可以通過這個(gè)埠與任何一個(gè)具有套接字接口的計(jì)算機(jī)通信 【 16】 。應(yīng)用程序在 15 網(wǎng)絡(luò)上傳輸、接收的信息都通過這個(gè)套接字接口來實(shí)現(xiàn)的。在應(yīng)用開發(fā)中如同使用文件句柄一樣,可以對套接字句柄進(jìn)行讀寫操作: sock=socket(AF_INET,SOCK_STREAM,0)。 函數(shù)的第一個(gè)參數(shù)用于指定 地址族,在 Windows下僅支持 AF_INET(TCP/IP地址 );第二個(gè)參數(shù)用于描述套接字的類型,對于流式套接字提供有 SOCK_STREAM;最后一個(gè)參數(shù)指定套接字使用的協(xié)議,一般為 0。該函數(shù)的返回值保存了新套接字的句柄,在程序退出前可以用 closesocket(sock)。函數(shù)來將其釋放。服務(wù)器方一旦獲取了一個(gè)新的套接字后應(yīng)通過 bind()將該套接字與本機(jī)上的一個(gè)端口相關(guān)聯(lián): =AF_INET。 =0。 =htons(USERPORT)。 bind(sock,(LPSOCKADDR)amp。sockin,sizeof(sockin)))。 該函數(shù)的第二個(gè)參數(shù)是一個(gè)指向包含有本機(jī) IP地址和端口信息的 sockaddr_in結(jié)構(gòu)類型的指針,其成員描述了本地端口號和本地主機(jī)地址,經(jīng)過 bind()將服務(wù)器進(jìn)程在網(wǎng)絡(luò)上標(biāo)識出來。需要注意的是由于 1024以內(nèi)的埠號都是保留的埠號因此如無特別需要一般不能將 1024以內(nèi)的值 【 17】 。然后調(diào)用 listen()函數(shù)開始偵聽,再通過 accept()調(diào)用等待接收連接以完成連接的建立: //連接請求隊(duì)列長度為 1,即只允許有一個(gè)請求 ,若有多個(gè)請求 , //則出現(xiàn)錯(cuò)誤,給出錯(cuò)誤代碼 WSAECONNREFUSED。 listen(sock,1)。 //開啟線程避免主程序的阻塞 AfxBeginThread(Server,NULL)。 ?? UINT Server(LPVOID lpVoid) { ?? int nLen=sizeof(SOCKADDR)。 pViewnewskt=accept(pViewsock,(LPSOCKADDR)amp。 pViewsockin,(LPINT)amp。 nLen)。 ?? WSAAsyncSelect(pViewnewskt,pViewm_hWnd,WM_SOCKET_MSG,FD_READ|FD_CLOSE)。 return 1。 } 這里之所以把 accept()放到一個(gè)線程中去 是因?yàn)樵趫?zhí)行到該函數(shù)時(shí)如沒有客戶連接服務(wù)器的請求到來,服務(wù)器就會(huì)停在 accept語句上等待連接請求的到來,這勢必會(huì)引起程序的阻塞,雖然也可以通過設(shè)置套接字為非阻塞方式使在沒有客戶等待時(shí)可以使 16 accept()函數(shù)調(diào)用立即返回,但這種輪詢套接字的方式會(huì)使 CPU處于忙等待方式,從而降低程序的運(yùn)行效率大大浪費(fèi)系統(tǒng)資源。考慮到這種情況,將套接字設(shè)置為阻塞工作方式,并為其單獨(dú)開辟一個(gè)子線程,將其阻塞控制在子線程范圍內(nèi)而不會(huì)造成整個(gè)應(yīng)用程序的阻塞。對于網(wǎng)絡(luò)事件的響應(yīng)顯然要采取異步選擇機(jī)制,只有采取這種方式才可以在由網(wǎng)絡(luò)對 方所引起的不可預(yù)知的網(wǎng)絡(luò)事件發(fā)生時(shí)能馬上在進(jìn)程中做出及時(shí)的響應(yīng)處理,而在沒有網(wǎng)絡(luò)事件到達(dá)時(shí)則可以處理其他事件,這種效率是很高的,而且完全符合Windows所標(biāo)榜的消息觸發(fā)原則。前面那段代碼中的 WSAAsyncSelect()函數(shù)便是實(shí)現(xiàn)網(wǎng)絡(luò)事件異步選擇的核心函數(shù)。 客戶機(jī)的設(shè)計(jì) 1)建立客戶端的 Socket 客戶端應(yīng)用程序首先也是調(diào)用 WSAStartup() 函數(shù)來與 Winsock的動(dòng)態(tài)連接庫建立關(guān)系,然后同樣調(diào)用 socket() 來建立一個(gè) TCP或 UDP socket(相同協(xié)定的 sockets 才能相通, TCP 對 TCP, UDP 對 UDP)。與服務(wù)器端的 socket 不同的是,客戶端的 socket 可以調(diào)用 bind() 函數(shù),由自己來指定 IP地址及 port號碼;但是也可以不調(diào)用 bind(),而由 Winsock來自動(dòng)設(shè)定 IP地址及 port號碼。 2)提出連接申請 客戶端的 Socket使用 connect()函數(shù)來提出與服務(wù)器端的 Socket建立連接的申請,函數(shù)調(diào)用成功返回 0,否則返回 SOCKET_ERROR。 int PASCAL FAR connect( SOCKET s, const struct sockaddr FAR *name, int namelen )。 參 數(shù): s: Socket 的識別碼; name: Socket想要連接的對方地址; namelen: name的長度 socket()connect()send()/recv()closesocket() 通過第四個(gè)參數(shù)注冊應(yīng)用程序感興取的網(wǎng)絡(luò)事件,在這里通過 FD_READ|FD_CLOSE指定了網(wǎng)絡(luò)讀和網(wǎng)絡(luò)斷開兩種事件,當(dāng)這種事件發(fā)生時(shí)變 會(huì)發(fā)出由第三個(gè)參數(shù)指定的自定義消息 WM_SOCKET_MSG,接收該消息的窗口通過第二個(gè)參數(shù)指定其句柄。在消息處理函數(shù)中可以通過對消息參數(shù)低字節(jié)進(jìn)行判斷而區(qū)別出發(fā)生的是何種網(wǎng)絡(luò)事件: void CNetServerView::OnSocket(WPARAM wParam,LPARAM lParam) { int iReadLen=0。 int message=lParam amp。 0x0000FFFF。 switch(message) { case 17 char cDataBuffer[MTU*10]。 //通過套接字接收信息 iReadLen = recv(newskt,cDataBuffer,MTU*10,0)。 //將信息保存到文件 if(!(,CFile::modeReadWrite)) (E:,CFile::modeCreate|CFile::modeReadWrite)。 ()。 (cDataBuffer,iReadLen)。 ()。 break。 case ??// 進(jìn)行相應(yīng)的處理 break。 default: break。 } } 在 這里需要實(shí)現(xiàn)對自定義消息 WM_SOCKET_MSG的響應(yīng),需要在頭文件和實(shí)現(xiàn)文件中分別添加其消息映射關(guān)系: 頭文件: //{{AFX_MSG(CNetServerView) //}}AFX_MSG void OnSocket(WPARAM wParam,LPARAM lParam)。 DECLARE_MESSAGE_MAP() 實(shí)現(xiàn)文件: BEGIN_MESSAGE_MAP(CNetServerView, CView) //{{AFX_MSG_MAP(CNetServerView) //}}AFX_MSG_MAP ON_MESSAGE(WM_SOCKET_MSG,OnSocket) END_MESSAGE_MAP() 部分源代碼 Connectdb()//本地?cái)?shù)據(jù)庫進(jìn)行連接 Local port=” 3350”// 定義連接端口 Local_ip=getipaddress()//得到本地 ip地址 (Local_port Local_ip)//進(jìn)行通信綁定 18 ()//通信控件進(jìn)行偵聽 Connectionrequest事件編碼 //連接請求時(shí)處理 li_lrow=(0) (li_lrow,”ms”,” 連接請求,遠(yuǎn)程 IP地址 :+ ”) if 0then () end if (requestid) remote_IP= li_lrow=(0) (li_lrow,”ms”,” 連接成功,遠(yuǎn)程 IP地址 :+ RemoteIP”) dataarrival:事件編碼: (rsf_recept,8) li_lrow=(0) (li_lrow,”ms”,” 收到數(shù)據(jù): ”“+data_recept) (li_lrow) deal_data(data_recept)//對接收的報(bào)文進(jìn)行處理 (data_return) low=(0) (lrow,”ms”,” 返回?cái)?shù)
點(diǎn)擊復(fù)制文檔內(nèi)容
畢業(yè)設(shè)計(jì)相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號-1