实现迭代型的echo服务器
生活随笔
收集整理的這篇文章主要介紹了
实现迭代型的echo服务器
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
文章目錄
- Socket服務(wù)器設(shè)計(jì)
- 實(shí)現(xiàn)迭代型的echo服務(wù)器
代碼倉(cāng)庫(kù)地址
Socket服務(wù)器設(shè)計(jì)
? 對(duì)于使用socket的網(wǎng)絡(luò)服務(wù)器端程序,有兩種常見(jiàn)的設(shè)計(jì)方式:
實(shí)現(xiàn)迭代型的echo服務(wù)器
#include <syslog.h> #include <sys/stat.h> #include <fcntl.h> #include "sys_tem.h"//< 創(chuàng)建迭代型 echo 服務(wù)器#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); //< 調(diào)用會(huì)使一個(gè)程序變成守護(hù)進(jìn)程 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];//< 將該進(jìn)程變成守護(hù)進(jìn)程if (becomeDaemon(0) == -1)perror("becomeDaemon");//< 創(chuàng)建一個(gè)socket 成功返回 0 失敗返回-1sfd = inetBind(SERVICE, SOCK_DGRAM, NULL);if (sfd == -1) {//< 創(chuàng)建socket失敗,記錄一下日志syslog(LOG_ERR, "Could not create server socket (%s)", strerror(errno));exit(EXIT_FAILURE);}/* Receive datagrams and return copies to senders *///< 收到之后,數(shù)收到的數(shù)據(jù)進(jìn)行處理,并將原始數(shù)據(jù)回顯的方式給發(fā)送者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));} }總結(jié)
以上是生活随笔為你收集整理的实现迭代型的echo服务器的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 2018中国国际大数据大会专属报名通道(
- 下一篇: 【热烈祝贺】我刊主编郑纬民教授荣获中国存