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>