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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

实现迭代型的echo服务器

發布時間:2025/3/15 编程问答 13 豆豆
生活随笔 收集整理的這篇文章主要介紹了 实现迭代型的echo服务器 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • Socket服務器設計
    • 實現迭代型的echo服務器

代碼倉庫地址

Socket服務器設計

? 對于使用socket的網絡服務器端程序,有兩種常見的設計方式:

  • 迭代式:服務器每次只處理一個客戶端,只有當完全處理完一個客戶端的請求后才會去處理下一個客戶端
  • 并發型:能夠同時處理單個客戶端的請求
  • 實現迭代型的echo服務器

    #include <syslog.h> #include <sys/stat.h> #include <fcntl.h> #include "sys_tem.h"//< 創建迭代型 echo 服務器#define BD_NO_CHDIR 01 /* Don't chdir("/") */ #define BD_NO_CLOSE_FILES 02 /* Don't close all open files */ #define BD_NO_REOPEN_STD_FDS 04 /* Don't reopen stdin, stdout, andstderr to /dev/null */ #define BD_NO_UMASK0 010 /* Don't do a umask(0) */#define BD_MAX_CLOSE 8192 /* Maximum file descriptors to close ifsysconf(_SC_OPEN_MAX) is indeterminate */ int becomeDaemon(int flags); //< 調用會使一個程序變成守護進程 int becomeDaemon(int flags) {int maxfd, fd;switch (fork()) { /* Become background process */case -1: return -1;case 0: break; /* Child falls through... */default: _exit(EXIT_SUCCESS); /* while parent terminates */}if (setsid() == -1) /* Become leader of new session */return -1;switch (fork()) { /* Ensure we are not session leader */case -1: return -1;case 0: break;default: _exit(EXIT_SUCCESS);}if (!(flags & BD_NO_UMASK0))umask(0); /* Clear file mode creation mask */if (!(flags & BD_NO_CHDIR))chdir("/"); /* Change to root directory */if (!(flags & BD_NO_CLOSE_FILES)) { /* Close all open files */maxfd = sysconf(_SC_OPEN_MAX);if (maxfd == -1) /* Limit is indeterminate... */maxfd = BD_MAX_CLOSE; /* so take a guess */for (fd = 0; fd < maxfd; fd++)close(fd);}if (!(flags & BD_NO_REOPEN_STD_FDS)) {close(STDIN_FILENO); /* Reopen standard fd's to /dev/null */fd = open("/dev/null", O_RDWR);if (fd != STDIN_FILENO) /* 'fd' should be 0 */return -1;if (dup2(STDIN_FILENO, STDOUT_FILENO) != STDOUT_FILENO)return -1;if (dup2(STDIN_FILENO, STDERR_FILENO) != STDERR_FILENO)return -1;}return 0; }#define SERVICE "echo" #define BUF_SIZE 500 #define IS_ADDR_STR_LEN 4096 int main(int argc, char *argv[]) {int sfd;ssize_t numRead;socklen_t len;struct sockaddr_storage claddr;char buf[BUF_SIZE];char addrStr[IS_ADDR_STR_LEN];//< 將該進程變成守護進程if (becomeDaemon(0) == -1)perror("becomeDaemon");//< 創建一個socket 成功返回 0 失敗返回-1sfd = inetBind(SERVICE, SOCK_DGRAM, NULL);if (sfd == -1) {//< 創建socket失敗,記錄一下日志syslog(LOG_ERR, "Could not create server socket (%s)", strerror(errno));exit(EXIT_FAILURE);}/* Receive datagrams and return copies to senders *///< 收到之后,數收到的數據進行處理,并將原始數據回顯的方式給發送者for (;;) {len = sizeof(struct sockaddr_storage);numRead = recvfrom(sfd, buf, BUF_SIZE, 0,(struct sockaddr *) &claddr, &len);if (numRead == -1)perror("recvfrom");if (sendto(sfd, buf, numRead, 0, (struct sockaddr *) &claddr, len)!= numRead)syslog(LOG_WARNING, "Error echoing response to %s (%s)",inetAddressStr((struct sockaddr *) &claddr, len,addrStr, IS_ADDR_STR_LEN),strerror(errno));} }

    總結

    以上是生活随笔為你收集整理的实现迭代型的echo服务器的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。