1. 程式人生 > >linux下實現p2p功能

linux下實現p2p功能

目的:實現客戶端與伺服器的對等通訊

伺服器端:

/*************************************************************************
    > File Name: test.c
    > Author: kinght
    > Mail: [email protected] 
    > Created Time: Wed 20 Jun 2018 06:58:02 PM PDT
 ************************************************************************/
#include<stdio.h> #include <sys/socket.h> //connect,send,recv,setsockopt等 #include <sys/types.h> #include <netinet/in.h> // sockaddr_in, "man 7 ip" ,htons #include <poll.h> //poll,pollfd #include <arpa/inet.h> //inet_addr,inet_aton #include <unistd.h> //read,write
#include <netdb.h> //gethostbyname #include <error.h> //perror #include <stdio.h> #include <errno.h> //errno #include <string.h> // memset #include <string> #include <iostream> #include<stdlib.h> #ifdef HAVE_NETINET_IN_H #include <netinet/in.h>
#endif #define ERR_EXIT(m)\ do\ {\ perror(m);\ exit(EXIT_FAILURE);\ }while(0) ssize_t readn(int fd, void *buf, size_t count) { size_t nleft = count; ssize_t nread; char *bufp = (char*)buf; while(nleft > 0) { if((nread= read(fd,bufp,nleft)< 0)) { if(errno = EINTR) { continue; } else { return -1; } } else if(nread = 0) { return count - nleft; } bufp += nread; nleft -= nread; } return count; } ssize_t writen(int fd, void *buf, size_t count) { size_t nleft = count; ssize_t nwriteen; char *bufp = (char*)buf; while(nleft > 0) { if((nwriteen= write(fd,bufp,nleft)< 0)) { if(errno = EINTR) { continue; } else { return -1; } } else if(nwriteen = 0) { continue; } bufp += nwriteen; nleft -= nwriteen; } return count; } void doServiceConn(int conn) { char recvbuf[1024]; while(true) { memset(recvbuf,0,sizeof(recvbuf)); int ret = read(conn,recvbuf,sizeof(recvbuf)); if(ret == 0) { printf("client close"); break; } else if(ret == -1) { ERR_EXIT("read"); } write(conn,recvbuf,ret); printf(recvbuf,stdout); } } int main(void) { int listenfd; if((listenfd =socket(PF_INET,SOCK_STREAM,IPPROTO_TCP))<0) { ERR_EXIT("ERROR"); } struct sockaddr_in servaddr; memset(&servaddr,0,sizeof(servaddr)); servaddr.sin_family=AF_INET; servaddr.sin_port = htons(5188); servaddr.sin_addr.s_addr = htonl(INADDR_ANY); int on = 1; if(setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on))< 0) { ERR_EXIT("SETSOCKOPT"); } if(bind(listenfd,(struct sockaddr*)&servaddr,sizeof(servaddr))< 0) { ERR_EXIT("error"); } if(listen(listenfd,SOMAXCONN)<0) { ERR_EXIT("listen"); } struct sockaddr_in peeraddr; socklen_t peerlen = sizeof(peeraddr); int conn; pid_t pid; while(1) { conn = accept(listenfd,(struct sockaddr*)&peeraddr,&peerlen); if(conn < 0) { ERR_EXIT("accept"); } printf("ip= %s,port = %d\n",inet_ntoa(peeraddr.sin_addr),ntohs(peeraddr.sin_port)); pid = fork(); if(pid == -1) ERR_EXIT("fork"); if(pid == 0) { char sendbuf[1024]={0}; while(fgets(sendbuf,sizeof(sendbuf),stdin)!= NULL) { write(conn,sendbuf,strlen(sendbuf)); memset(sendbuf,0,sizeof(sendbuf)); } exit(EXIT_SUCCESS); } else { char recvbuf[1024]; while(1) { memset(recvbuf,0,sizeof(recvbuf)); int ret= read(conn,recvbuf,sizeof(recvbuf)); if(ret == -1) ERR_EXIT("read"); else if(ret == 0) { printf("peer close"); break; } fputs(recvbuf,stdout); } exit(EXIT_SUCCESS); } } return 0; }

客戶端程式碼:

/*************************************************************************
    > File Name: client.c
    > Author: kinght
    > Mail: [email protected] 
    > Created Time: Wed 20 Jun 2018 06:58:02 PM PDT
 ************************************************************************/

#include<stdio.h>
#include <sys/socket.h>   //connect,send,recv,setsockopt等
#include <sys/types.h>      

#include <netinet/in.h>     // sockaddr_in, "man 7 ip" ,htons
#include <poll.h>             //poll,pollfd
#include <arpa/inet.h>   //inet_addr,inet_aton
#include <unistd.h>        //read,write
#include <netdb.h>         //gethostbyname

#include <error.h>         //perror
#include <stdio.h>
#include <errno.h>         //errno

#include <string.h>          // memset
#include <string>
#include <iostream>
#include<stdlib.h>
#ifdef HAVE_NETINET_IN_H
#include <netinet/in.h>
#endif

#define ERR_EXIT(m)\
    do\
{\
    perror(m);\
    exit(EXIT_FAILURE);\
}while(0)

int main(void)
{
    int sock;
    if((sock =socket(PF_INET,SOCK_STREAM,IPPROTO_TCP))<0)
    {
        ERR_EXIT("ERROR");   
    }
    struct sockaddr_in servaddr;
    memset(&servaddr,0,sizeof(servaddr));
    servaddr.sin_family=AF_INET;
    servaddr.sin_port = htons(5188);
    servaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
    if(connect(sock,(struct sockaddr*)&servaddr,sizeof(servaddr))< 0)
    {
    ERR_EXIT("connect");
    }
    pid_t pid;
    pid = fork();
    if(pid == -1)
    {
        ERR_EXIT("pid");
    }
    else if(pid == 0)
    {
        char recvbuf[1024]={0};
        while(1)
        {
            memset(recvbuf,0,sizeof(recvbuf));
            int ret = read(sock,recvbuf,sizeof(recvbuf));
            if(ret == -1)
                ERR_EXIT("read");
            else if(ret == 0)
            {
                printf("peer close");
            }
            fputs(recvbuf,stdout);
        }
    }
    else
    {
        char sendbuf[1024]={0};
        while(fgets(sendbuf,sizeof(sendbuf),stdin)!=NULL)
        {
            write(sock,sendbuf,strlen(sendbuf));
            memset(sendbuf,0,sizeof(sendbuf));
        }

    }
    return 0;
}

相關推薦

linux實現p2p功能

目的:實現客戶端與伺服器的對等通訊 伺服器端: /************************************************************************* > File Name: test.c

Linux實現U盤、SD卡自動掛載功能 .

在 Linux中我們經常用到U盤、SD卡的掛載問題,每次都手動掛載或解除安裝非常麻煩,我們可以採取以下方法實現自動掛載或解除安裝U盤、SD卡 1、首先在/etc/init.d/rsC中加入以下語句 echo /sbin/mdev > /proc/sys/kernel/

linux實現nginx安裝實現端口區分,域名區分

方便 img per 修改配置文件 mpat 直接 exp reg 獨立 nginx是一款高性能的http服務器/反向代理服務器及電子郵件代理服務器. 官方網站: http://nginx.org/ 1、http服務器。Nginx是一個http服務可以獨立提供http服務。

Linux實現免密碼登錄(超詳細)_Linux_腳本之家

.html ini 服務 meta word ssh密鑰 密碼登錄 rda lin Linux ssh密鑰登錄和取消密鑰登錄 2016-05-18? linux技巧 ? 暫無評論 在VPS中利用vi編輯器編輯sshd的配置文件 vi /etc/ssh/sshd_conf

Linux實現多網卡綁定

bond team nmctl 使用bind綁定多個網卡 由於服務器上對於可用性的要求都比較高,對於各項功能都會有有冗余設計,比如,磁盤、電源、網卡、甚至服務器本身等等,今天嘗試做一下網卡綁定實現網卡的冗余。網卡綁定的實現表面上看起來有些像是硬盤實現邏輯卷,都是通過創建一個邏輯設備來實現的。實現網

linux實現目錄即文件的完整刪除

truct remove define limits In continue tin mit ret 功能:   1、刪除目錄   2、刪除文件   3、刪除不為空的目錄即下屬文件 #ifndef _DELETE_FILE #define _DELETE_FILE #in

linux實現ssh免密登錄

復制 由於 linu width tro watermark linux roc 密碼登錄 設置ssh無密碼登錄可以提高我們主機的安全性。ssh 無密碼登錄要使用公鑰與私鑰。linux下可以用ssh-keygen生成公鑰/私鑰對,接下來以Centos為例。例圖:實驗主機A無

Linux實現彩色進度條程式

程式碼: #include <stdio.h> #include <unistd.h> #include <string.h> int main() { int i = 0; char bar[101]; const char *la

Linux實現指令碼監測特定程序佔用記憶體情況

記憶體洩露是C/C++程式設計師經常需要面對的問題,除了有效地經常查找出記憶體洩露的位置外,在嵌入式的開發中,還經常需要確定自己寫的程式是否存在記憶體洩露的情況 Linux系統下,我們可以利用以下命令來獲取特定程序的執行情況: cat /proc/$PID/status 其中

Linux實現客戶端兩連跳ping百度,修改dns和nmcil的用法

1.客戶端跳兩次路由器ping百度 rht vmctl reset 重置虛擬機器 真機和虛擬機器開啟火牆策略 用在配置網路單元學的修改兩機閘道器 設定server為雙網絡卡路由端接觸客戶端Desktop閘道器為1.1.1.100 路由器端設定GATEWAY為真機,記得syste

Linux實現進度條程式. 通過makefile進行編譯. 建議自主完成一個彩色的進度條.

Linux下用C語言完成一個彩色進度條 1.建一個Makefile檔案 2.vim Makefile test:test.c

Linux實現腳本監測特定進程占用內存情況

date 信息 進程pid -s 虛擬內存 狀況 文件 python 完整 Linux系統下,我們可以利用以下命令來獲取特定進程的運行情況: cat /proc/$PID/status 其中PID是具體的進程號,這個命令打印出/proc/特定進程/status文件的內

Linux實現Mysql定時任務備份資料

建立備份目錄 本例項將建立目錄放置於/mnt目錄下,可根據具體情況放置於其他目錄: cd /mnt mkdir dbback pwd /mnt/dbback 建立shell指令碼 指令碼名稱可根據自己規範進行自定義: vim bcmysql.sh 進入編輯器

SSM框架實現更新功能

  做修改用我這種方式還有點複雜,其中的邏輯是這樣的: 1.第一步我總是從xml中寫sql語句開始,這裡用了兩個語句,一是更新語句,一個是根據id查詢語句,後面會用到的。 2. 然後就是Mapper.java,DaoI,DaoImp,ServiceI,ServiceImp層。 3.然後邏輯是這樣的,用i

Linux實現 MySQL 數據庫定時自動備份

用戶 itl 安裝 centos fin nta 腳本 apach 例子 Linux 下如何實現 MySQL 數據庫定時自動備份? 概述

Linux實現最常用的磁碟陣列RAID5

(一) RAID簡介:獨立磁碟冗餘陣列(RAID, Redundant Array of Independent Disks),舊稱廉價磁碟冗餘陣列(RAID,Redundant Array of Inexpensive Disks),簡稱硬碟陣列。其基本思想就是把多個相對便宜的硬碟組合起來,成為一個硬碟陣列

linux實現在程式執行時的函式替換(熱補丁)

原帖地址: 宣告:以下的程式碼成果,是參考了網上的injso技術,在本文的最後會給出地址,同時非常感謝injso技術原作者的分享。    但是injso文章中的程式碼存在一些問題,所以後面出現的程式碼是經過作者修改和檢測的。也正因為這些錯誤,加深了我的學習深度。 &nb

linux實現doc轉html

1. 概述 windows下藉助.net好解決這個問題. 嘗試python java php 都被坑了,尤其是docx之前的word版本。 最終解決辦法:libreoffice 2. 安裝 yum install libreoffice libreoffice-he

除了vim, 還有哪些常用的牛逼的編輯器。 自行查詢資料, 調研除了gcc, 還有哪些常用的牛逼的編譯器,為什麼除錯的時候需要編譯選項中新增 -g在Linux實現進度條程式

除了vim, 還有哪些常用的牛逼的編輯器, 並能夠橫向對比編輯器之間的區別和優缺點。 首先先有一個概念IDE(整合開發環境),厲害的有vs等等。vim以及Emacs就向著這個方向發展。為了實現其強大功能。vim有了多模式編輯有(normal,insert,vis

Linux實現彩色進度條

#include <stdio.h>