socket 編程:回射客戶/服務程序

參考 《Unix 網絡編程》

github 地址

  • unp.h
#include <stdio.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <string.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/wait.h>#define MAXLINE 4096
#define SERV_PORT 9877
#define LISTENQ 1024void str_echo(int sockfd);
void err_sys(const char *, ...);// client interface
void str_cli(FILE *fp, int sockfd);
  • echo_service.c
#include    "unp.h"void sig_chld(int signo) {pid_t pid;int stat;// 通過stat指針返回子進程終止狀態// 正常終止、信號殺死、作業控制停止// pid = wait(&stat);// 防止同一信號多次提交導致子進程僵死while((pid = waitpid(-1, &stat, WNOHANG)) > 0) {// do nothing}
}int main(int argc, char **argv) {int listenfd, connfd;pid_t childpid;socklen_t clilen;struct sockaddr_in cliaddr, servaddr;listenfd = socket(AF_INET, SOCK_STREAM, 0);bzero(&servaddr, sizeof(servaddr));servaddr.sin_family = AF_INET;servaddr.sin_addr.s_addr = htonl(INADDR_ANY);servaddr.sin_port = htons(SERV_PORT);bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr));listen(listenfd, LISTENQ);signal(SIGCHLD, sig_chld);for(;;) {clilen = sizeof(cliaddr);connfd = accept(listenfd, (struct sockaddr*)&cliaddr, &clilen);if ((childpid = fork()) == 0) {close(listenfd);str_echo(connfd);exit(0);}close(connfd);}
}
  • str_echo.c
#include    "unp.h"void str_echo(int sockfd) {ssize_t n;char buf[MAXLINE];while( (n = read(sockfd, buf, MAXLINE)) > 0) {write(sockfd, buf, n);}
}/*
void str_echo(int sockfd) {long arg1, arg2;ssize_t n;char line[MAXLINE];for(;;) {if ( (n = read(sockfd, line, MAXLINE)) == 0) {return;}if (sscanf(line, "%ld%ld", &arg1, &arg2) == 2) {snprintf(line, sizeof(line), "%ld\n", arg1, arg2);}else {snprintf(line, sizeof(line), "input error\n");}n = strlen(line);write(sockfd, line, n);}
}
*/
  • error.c
#include    "unp.h"#include        <stdarg.h>              /* ANSI C header file */
#include        <syslog.h>              /* for syslog() */int             daemon_proc;            /* set nonzero by daemon_init() */static void     err_doit(int, int, const char *, va_list);void
err_sys(const char *fmt, ...)
{va_list         ap;va_start(ap, fmt);err_doit(1, LOG_ERR, fmt, ap);va_end(ap);exit(1);
}static void
err_doit(int errnoflag, int level, const char *fmt, va_list ap)
{int             errno_save, n;char    buf[MAXLINE + 1];errno_save = errno;             /* value caller might want printed */
#ifdef  HAVE_VSNPRINTFvsnprintf(buf, MAXLINE, fmt, ap);       /* safe */
#elsevsprintf(buf, fmt, ap);                                 /* not safe */
#endifn = strlen(buf);if (errnoflag)snprintf(buf + n, MAXLINE - n, ": %s", strerror(errno_save));strcat(buf, "\n");if (daemon_proc) {syslog(level, buf);} else {fflush(stdout);         /* in case stdout and stderr are the same */fputs(buf, stderr);fflush(stderr);}return;
}
  • echo_client.c
#include    "unp.h"
#include <stdio.h>
#include <unistd.h>
#include <arpa/inet.h>int main(int argc, char **argv) {int sockfd[5];struct sockaddr_in servaddr;int i=0;for (i=0; i<5; i++) {sockfd[i] = socket(AF_INET, SOCK_STREAM, 0);bzero(&servaddr, sizeof(servaddr));servaddr.sin_family = AF_INET;servaddr.sin_port = htons(SERV_PORT);inet_pton(AF_INET, "127.0.0.1", &servaddr.sin_addr);connect(sockfd[i], (struct sockaddr*)&servaddr, sizeof(servaddr));}str_cli(stdin, sockfd[0]);exit(0);
}
  • str_cli.c
#include "unp.h"// maxline 4096void str_cli(FILE *fp, int sockfd) {char sendline[MAXLINE], receline[MAXLINE];int n;while(fgets(sendline, MAXLINE, fp) != EOF) {write(sockfd, sendline, n);bzero(sendline, strlen(sendline));if (read(sockfd, receline, MAXLINE) == 0) {printf("str cli: server terminated prematurely");}fputs(receline,  stdout);}
}
  • CMakeList.txt
project(echo_srv)
set(CMAKE_CXX_STANDARD 11)
add_executable(echo_srv echo_service.c str_echo.c error.c)# client
add_executable(echo_cli echo_client.c str_cli.c)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/375496.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/375496.shtml
英文地址,請注明出處:http://en.pswp.cn/news/375496.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C++學習筆記25,析構函數總是會宣布virtual

為了永遠記住析構函數聲明virtual----><<effective c>> 為這句話不一定對,但無需質疑的是這句話是非常實用的. 查看以下的樣例: #include <iostream> #include <string> using namespace std; class B{ public:~B(){cout<<"base is dest…

BZOJ-1019 漢諾塔

其實只要非常了解漢諾塔的原理&#xff0c;或者是能計算出對于隨機數據一定有解的證明&#xff0c;那么這道題就是水題了。 【Code】轉載于:https://www.cnblogs.com/NanoApe/p/4396718.html

C++ 構建最小堆、最大堆

堆的屬性 完全二叉樹每個節點的值都大于&#xff08;最大堆&#xff09;或都小于&#xff08;最小堆&#xff09;子節點的值 堆只是一種數據的組織形式&#xff0c;存儲結構可以用數組&#xff0c;在構建堆的過程中&#xff0c;可以使用完全二叉樹的性質求父子節點的下標。 …

那么溫暖http合約,入門。

簡介 HTTP是一個屬于應用層的面向對象的協議&#xff0c;因為其簡捷、高速的方式。適用于分布式超媒體信息系統。它于1990年提出。經過幾年的使用與發展&#xff0c;得到不斷地完好和擴展。眼下在WWW中使用的是HTTP/1.0的第六版&#xff0c;HTTP/1.1的規范化工作正在進行之中&a…

數組中第K個最大元素

在未排序的數組中找到第 k 個最大的元素。請注意&#xff0c;你需要找的是數組排序后的第 k 個最大的元素&#xff0c;而不是第 k 個不同的元素。 示例 1: 輸入: [3,2,1,5,6,4] 和 k 2 輸出: 5示例 2: 輸入: [3,2,3,1,2,4,5,5,6] 和 k 4 輸出: 4說明: 你可以假設 k 總是有…

各大互聯網公司2014前端筆試面試題–JavaScript篇

很多面試題是我自己面試BAT親身經歷碰到的。整理分享出來希望更多的前端er共同進步吧&#xff0c;不僅適用于求職者&#xff0c;對于鞏固復習js更是大有裨益。 而更多的題目是我一路以來收集的&#xff0c;也有往年的&#xff0c;答案不確保一定正確&#xff0c;如有錯誤或有更…

iOS:蘋果企業證書通過網頁分發安裝app

本文轉載至 http://blog.sina.com.cn/s/blog_6afb7d800101fa16.html 蘋果的企業級證書發布的應用&#xff0c;是不用設備授權即可直接安裝&#xff0c;并且不限設備上限。為了方便分發&#xff0c;蘋果有協議實現通過網頁鏈接直接下載安裝企業級的應用。 基本的原理就是在生成企…

這道題很難

請編寫一個函數&#xff0c;使其可以刪除某個鏈表中給定的&#xff08;非末尾&#xff09;節點。傳入函數的唯一參數為 要被刪除的節點 。 現有一個鏈表 – head [4,5,1,9]&#xff0c;它可以表示為: 示例 1&#xff1a; 輸入&#xff1a;head [4,5,1,9], node 5 輸出&a…

設計模式學習筆記-基礎知識篇

1. 設計模式的重要性 1.1 設計模式解決的是在軟件過程中如何來實現具體的軟件功能。實現同一個功能的方法有很多&#xff0c;哪個設計容易擴展&#xff0c;容易復用&#xff0c;松耦合&#xff0c;可維護&#xff1f;設計模式指導我們找到最優方案。 1.2 設計中往往會存在設計缺…

JavaScript對象類型詳解

《JavaScript高級程序設計》已經學習到了第四章&#xff0c;不過因為第五章講的都是各種對象類型&#xff0c;所以在進行第五章的學習之前&#xff0c;先深入了解一下對象是有好處的。 JavaScript Objects in Detail 關于對象類型的方方面面在這篇文章里都寫得很清楚了&#xf…

旋轉鏈表

給定一個鏈表&#xff0c;旋轉鏈表&#xff0c;將鏈表每個節點向右移動 k 個位置&#xff0c;其中 k 是非負數。 示例 1: 輸入: 1->2->3->4->5->NULL, k 2輸出: 4->5->1->2->3->NULL解釋:向右旋轉 1 步: 5->1->2->3->4->NULL向…

內心的平靜就是財富本身-Cell組件-用友華表的由來-T君

時至今日&#xff0c;Cell組件仍是應用廣泛的商業報表組件 作者&#xff1a;人生三毒 編者注&#xff1a;本文作者人生三毒為知名網站及網頁游戲公司創始人&#xff0c;此前曾為IT類媒體資深編輯&#xff0c;見證了中國互聯網早期的發展。 認識T君之前先認識的是他的軟件&#…

mybatis06 增刪改差 源碼

user.java package cn.itcast.mybatis.po;import java.util.Date;public class User {private int id;private String username;// 用戶姓名private String sex;// 性別private Date birthday;// 生日private String address;// 地址public int getId() {return id;}public voi…

socket 編程 基于 select 實現的回射客戶端/服務程序

github 代碼 地址 unp.h #include <stdio.h> #include <unistd.h> #include <arpa/inet.h> #include <string.h> #include <sys/socket.h> #include <stdlib.h> #include <errno.h> #include <sys/wait.h> #include <sys…

MyEclipse的優化

出自&#xff1a;http://blog.csdn.net/u010124571/article/details/41316255?refmyread 第一步: 取消自動validation validation有一堆&#xff0c;什么xml、jsp、jsf、js等等&#xff0c;我們沒有必要全部都去自動校驗一下&#xff0c;只是需要的時候才會手工校驗一下&…

NSlog輸出

NSLog的定義 void NSLog(NSString *format, …); 基本上&#xff0c;NSLog很像printf&#xff0c;同樣會在console中輸出顯示結果。不同的是&#xff0c;傳遞進去的格式化字符是NSString的對象&#xff0c;而不是char *這種字符串指針。 實例 NSLog可以如下面的方法使用&#x…

推理題,會則秒解

你和你的朋友&#xff0c;兩個人一起玩 Nim 游戲&#xff1a;桌子上有一堆石頭&#xff0c;每次你們輪流拿掉 1 - 3 塊石頭。 拿掉最后一塊石頭的人就是獲勝者。你作為先手。 你們是聰明人&#xff0c;每一步都是最優解。 編寫一個函數&#xff0c;來判斷你是否可以在給定石頭…

【圖論】割點、橋、雙連通

連通分量 個數可以通過一次BFS或者DFS得到 割點和橋 可以枚舉刪除每一個點或者每一條邊&#xff0c;判斷連通分量個數是否增加 更好的方法 該算法是R.Tarjan發明的。對圖深度優先搜索&#xff0c;定義DFS(u)為u在搜索樹&#xff08;以下簡稱為樹&#xff09;中被遍歷到的次序號…

奇酷手機顯示Log

1、在桌面點擊撥號&#xff0c;在撥號盤輸入“*20121220#”&#xff0c;進入工程模式;2、看到日志輸出等級&#xff0c;點進去 Log print enable 選 enable Java log level 選 LOGV C and C log level 選 LOGV Kernel log level 選 KERN_DEBUG3、完畢 參考網址&#xff1a;http…

getCanonicalPath getAbsolutePath區別

1、在winows環境下它們的區別是 &#xfeff;&#xfeff;getCanonicalPath是標準路徑&#xff0c;沒有特殊字符&#xff0c;getAbsolutePath是有特殊字符的 2、在AIX系統中它們的區別&#xff1a; 首先編譯&#xff1a;javac com/ai/test/BugTest.java 然后運行&#xff1a;ja…