日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

低成本服务解决方案

發(fā)布時(shí)間:2025/4/5 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 低成本服务解决方案 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

? ? 做服務(wù)無非就那幾步,啟動(dòng)端口監(jiān)聽、接收請(qǐng)求數(shù)據(jù)、分配資源受理,反饋應(yīng)答數(shù)據(jù),關(guān)閉釋放資源。一個(gè)優(yōu)秀的服務(wù)端實(shí)現(xiàn)要考慮并發(fā)處理和對(duì)共享資源控制還是要費(fèi)點(diǎn)心思的。Linux下提供了一個(gè)基于xinetd服務(wù)的低成本小制作解決方案,用起來超方便,優(yōu)缺點(diǎn)放最后總結(jié)歡迎點(diǎn)評(píng)。

0001: /****************************************/ 0002: /* Author: gong_libin */ 0003: /* Date: 2000_01_01 */ 0004: /* File: GDeamon.c */ 0005: /****************************************/ 0006: 0007: /** 0008: * /etc/xinetd.d/GDeamon 0009: * service GDeamon 0010: * { 0011: * flags = REUSE 0012: * socket_type = stream 0013: * wait = no 0014: * user = root 0015: * server = /usr/bin/GDeamon 0016: * log_on_failure += USERID 0017: * disable = no 0018: * } 0019: * 0020: * /etc/services 0021: * GDeamon 321/tcp # The GDeamon Protocol 0022: */ 0023: 0024: #include <stdio.h> 0025: #include <stdlib.h> 0026: #include <string.h> 0027: #include <unistd.h> 0028: #include <fcntl.h> 0029: #include <time.h> 0030: 0031: #define G_STDIN stdin 0032: #define G_STDOUT stdout 0033: #define G_STDERR stderr 0034: 0035: #define G_TIMOUT 10 0036: #define G_PACKET 1024 0037: #define G_RESULT G_PACKET * G_PACKET 0038: 0039: int main(int argc, char* argv[]) 0040: { 0041: FILE* pstPipe = NULL; 0042: time_t ulTime = time(NULL); 0043: char szPacket[G_PACKET] = {0}; 0044: char szResult[G_RESULT] = {0}; 0045: int iCount = 0, iTotal = 0, iLength = 0; 0046: 0047: close(fileno(G_STDERR)); 0048: fcntl(fileno(G_STDIN), F_SETFL, O_NONBLOCK); 0049: 0050: if (fread(&iLength, sizeof(int), 1, G_STDIN) > 0) { 0051: while (iTotal < iLength) { 0052: if (time(NULL) - ulTime > G_TIMOUT) { 0053: printf("數(shù)據(jù)接收超時(shí)"); 0054: break; 0055: } 0056: if ((iCount = fread(&szPacket[iTotal], sizeof(char), G_PACKET - iTotal, G_STDIN)) > 0) { 0057: iTotal += iCount; 0058: } 0059: } 0060: if (iLength == strlen(szPacket)) { 0061: if (NULL != (pstPipe = popen(szPacket, "r"))) { 0062: if (NULL != fgets(szResult, G_PACKET, pstPipe)) { 0063: printf("%s", szResult); 0064: } 0065: pclose(pstPipe); 0066: } 0067: else { 0068: printf("命令執(zhí)行失敗"); 0069: } 0070: } 0071: else { 0072: printf("數(shù)據(jù)長(zhǎng)度錯(cuò)誤"); 0073: } 0074: } 0075: 0076: return 0; 0077: }

????009-018定義配置文件/etc/xinetd.d/Gdeamon,通知系統(tǒng)允許端口復(fù)用、傳輸層是TCP協(xié)議、不等待進(jìn)程終止、進(jìn)程歸屬root用戶、執(zhí)行程序存放路徑等信息。

????021行追加到/etc/services文件中,通知系統(tǒng)傳輸層協(xié)議類型和監(jiān)聽端口及服務(wù)名稱。

????047行關(guān)閉錯(cuò)誤輸出免得添亂,48行設(shè)置標(biāo)準(zhǔn)輸入為非阻塞模式。

????050行從標(biāo)準(zhǔn)輸入讀取一個(gè)整形,在這個(gè)用例中這個(gè)整形用于表示后面數(shù)據(jù)的長(zhǎng)度。

????051-059行根據(jù)上面整形值循環(huán)讀取數(shù)據(jù)直到讀取完畢或超時(shí)為止。

????060行判斷讀取數(shù)據(jù)的完整性。

????061-069把用戶發(fā)送過來的指令提交系統(tǒng)執(zhí)行并通過管道獲取執(zhí)行結(jié)果。

????063行把執(zhí)行結(jié)果通過標(biāo)準(zhǔn)輸出返回。

????完事了就這么簡(jiǎn)單省心省力滿足并發(fā)處理資源回收完全不操心,監(jiān)聽端口監(jiān)聽到連接的時(shí)候會(huì)fork子進(jìn)程,同時(shí)把子連接的套接字傳下去,并把讀寫操作重定向到標(biāo)準(zhǔn)輸入輸出上,真欣賞這種簡(jiǎn)單粗暴而又行之有效的做法。用例僅供參考,至于通信協(xié)議和異常機(jī)制沒做過多處理,需要自己加吧。

????優(yōu)點(diǎn):開發(fā)便利快捷,重點(diǎn)可放在業(yè)務(wù)流的上,處理并發(fā)量不大邏輯不復(fù)雜的接口半天時(shí)間連調(diào)帶測(cè)足夠;不僅支持tcp協(xié)議也支持udp協(xié)議,可以節(jié)省大量服務(wù)框架代碼的開發(fā)工作量;

????缺點(diǎn):并發(fā)量一大力不從心,響應(yīng)不夠快速高效,在線調(diào)測(cè)不夠方便;

????今晚有雨出門帶傘~

總結(jié)

以上是生活随笔為你收集整理的低成本服务解决方案的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。