簡單的C++檔案伺服器--Linux C++客戶端從服務端獲取檔案
client.cpp
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <netdb.h>
#define MAXLINE 4096
int main(int argc, char** argv){
int sockfd, len;
char buff[MAXLINE];
struct sockaddr_in servaddr;
FILE *fp;
int n;
if( argc != 2){
printf("usage: ./client <ipaddress>\n");
return 0;
}
if( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){
printf("create socket error: %s(errno: %d)\n", strerror(errno),errno);
return 0;
}
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(6666);
if( inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0){
printf("inet_pton error for %s\n",argv[1]);
return 0;
}
if( connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0){
printf("connect error: %s(errno: %d)\n",strerror(errno),errno);
return 0;
}
if( ( fp = fopen("sbt_client.with-apt-boost","ab") ) == NULL ){
printf("File.\n");
close(sockfd);
exit(1);
}
while(1){
n = read(sockfd, buff, MAXLINE);
if(n == 0)
break;
fwrite(buff, 1, n, fp);
}
buff[n] = '\0';
printf("recv msg from server: %s\n", buff);
close(sockfd);
fclose(fp);
return 0;
}
server.cpp
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<unistd.h>
#define MAXLINE 4096
int main(int argc, char** argv){
int listenfd, sockfd, len;
struct sockaddr_in servaddr;
char buff[4096];
FILE *fp;
int n;
if( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1 ){
printf("create socket error: %s(errno: %d)\n",strerror(errno),errno);
return 0;
}
printf("----init socket----\n");
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(6666);
//設定埠可重用
int contain;
setsockopt(listenfd,SOL_SOCKET, SO_REUSEADDR, &contain, sizeof(int));
if( bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1){
printf("bind socket error: %s(errno: %d)\n",strerror(errno),errno);
return 0;
}
printf("----bind sucess----\n");
if( listen(listenfd, 10) == -1){
printf("listen socket error: %s(errno: %d)\n",strerror(errno),errno);
return 0;
}
if((fp = fopen("/root/sbt_client.with-apt-boost","rb") ) == NULL )
{
printf("File open.\n");
close(listenfd);
exit(1);
}
printf("======waiting for client's request======\n");
while(1){
struct sockaddr_in client_addr;
socklen_t size=sizeof(client_addr);
if( (sockfd = accept(listenfd, (struct sockaddr*)&client_addr, &size)) == -1){
printf("accept socket error: %s(errno: %d)",strerror(errno),errno);
continue;
}
bzero(buff,sizeof(buff));
while(!feof(fp)){
len = fread(buff, 1, sizeof(buff), fp);
if(len != write(sockfd, buff, len)){
printf("write.\n");
break;
}
}
close(sockfd);
fclose(fp);
}
close(listenfd);
return 0;
}
基於boost庫的非同步檔案伺服器
#include <iostream>
#include <boost/asio.hpp>
#include <boost/bind.hpp>
#define MAXLINE 4096
// 非同步伺服器類
class Server {
private:
// 檔案指標
FILE *fp;
// 讀取buff長度
int len;
// 檔案buff
char buff[MAXLINE];
// 服務例項
boost::asio::io_service& ios_;
// 接收器例項
boost::asio::ip::tcp::acceptor acceptor_;
// socket智慧指標
typedef boost::shared_ptr<boost::asio::ip::tcp::socket> socket_ptr;
public:
Server(boost::asio::io_service& _ios) : ios_(_ios),
acceptor_(_ios, boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), 6666)) {
// 預設執行
start();
}
// 啟動網路偵聽的操作入口
void start(void) {
// 自定義的智慧指標
socket_ptr socket(new boost::asio::ip::tcp::socket(ios_));
// 非同步偵聽,若有服務連線,則自動呼叫Server::accept_handler函式,並將error, socket傳入作為引數
acceptor_.async_accept(*socket,
boost::bind(&Server::accept_handler, this,
boost::asio::placeholders::error/* 此處作為佔位符 */, socket));
}
// 請求者響應後觸發的處理器
void accept_handler(const boost::system::error_code& _ec, socket_ptr _socket) {
// 錯誤碼檢測
if (_ec) {
return;
}
// 列印當前連線進來的客戶端
std::cout << "client: " << _socket->remote_endpoint().address() << std::endl;
//開啟檔案
if ((fp = fopen("/root/sbt_client.with-apt-boost", "rb")) == NULL)
{
printf("File open error.\n");
exit(1);
}
// 非同步傳送檔案
bzero(buff, sizeof(buff));
while (!feof(fp)) {
len = fread(buff, 1, sizeof(buff), fp);
// 非同步傳送檔案單詞讀取buff到客戶端,傳送成功後,自動呼叫Server::write_handler函式
_socket->async_write_some(boost::asio::buffer(buff, len),
boost::bind(&Server::write_handler, this,
boost::asio::placeholders::error/* 此處作為佔位符 */));
}
// 關閉檔案讀取
fclose(fp);
// 非同步傳送 "hello CSND_Ayo" 訊息到客戶端,傳送成功後,自動呼叫Server::write_handler函式
//_socket->async_write_some(boost::asio::buffer("hello CSND_Ayo"),
// boost::bind(&Server::write_handler, this,
// boost::asio::placeholders::error/* 此處作為佔位符 */));
// 啟動新的非同步監聽
start();
}
// 完成非同步寫操作後的處理器
void write_handler(const boost::system::error_code& _ec) {
std::cout << "server: send message complete." << std::endl;
}
};
int main(void) {
try {
std::cout << "server started." << std::endl;
// 建造服務物件
boost::asio::io_service ios;
// 構建Server例項
Server server(ios);
// 啟動非同步呼叫事件處理迴圈
ios.run();
}
catch (std::exception& _e) {
std::cout << _e.what() << std::endl;
}
std::cout << "server stopping." << std::endl;
return 0;
}
相關文章
- 檔案下載之斷點續傳(客戶端與服務端的實現)斷點客戶端服務端
- 服務端如何獲取客戶端請求IP地址服務端客戶端
- 【SQLPLUS】sqlplus 客戶端所需的檔案列表SQL客戶端
- Qt實現基於多執行緒的檔案傳輸(服務端,客戶端)QT執行緒服務端客戶端
- Windows10 VS2017 C++ Server Socket簡單伺服器端與客戶端WindowsC++Server伺服器客戶端
- 一個端到端的基於 form 表單的檔案上傳程式,包含客戶端和伺服器端ORM客戶端伺服器
- Linux下簡單的ACE socket客戶端和伺服器端Linux客戶端伺服器
- 利用程序池給客戶端傳檔案客戶端
- Socket最簡單的客戶端與服務端通訊-Java客戶端服務端Java
- Java SSH 客戶端 如何刪除 linux 機器上的 檔案Java客戶端Linux
- 服務端,客戶端服務端客戶端
- 客戶端,服務端客戶端服務端
- SHA-256加密簡單例項(客戶端、服務端)加密單例客戶端服務端
- 在OwinSelfHost專案中獲取客戶端IP地址客戶端
- 在SelfHost專案中獲取客戶端IP地址客戶端
- gRPC之.Net6中的客戶端和服務端共用proto協議檔案RPC客戶端服務端協議
- MQTT伺服器搭建服務端和客戶端MQQT伺服器服務端客戶端
- C++ 獲取PE檔案自校驗值的程式碼C++
- 【Azure 雲服務】如何從Azure Cloud Service中獲取專案的部署檔案Cloud
- C++程式碼實現一個簡易http服務端,返回給客戶端一張圖片C++HTTP服務端客戶端
- 在容器服務中獲取客戶端真實源 IP客戶端
- Windows拉取linux上面檔案的簡單方法WindowsLinux
- 轉:檔案的斷點下載服務端斷點服務端
- 利用執行緒池給客戶端傳檔案執行緒客戶端
- ForkLift for Mac (檔案管理器和FTP客戶端)MacFTP客戶端
- ForkLift for Mac(檔案管理器和FTP客戶端)MacFTP客戶端
- SecureFX for Mac(跨平臺檔案傳輸客戶端)Mac客戶端
- 伺服器獲取真實客戶端 IP伺服器客戶端
- 簡單的Bindservice服務獲取隨機數,需要在清單檔案中註冊service隨機
- C/C++讀取SEGY檔案(三)C++
- 獲取客戶端Mac地址客戶端Mac
- 客戶端svn上傳後,原始檔案在伺服器的什麼位置?客戶端伺服器
- SpringBoot獲取配置檔案,就這麼簡單。Spring Boot
- MQTT協議從服務端到客戶端詳解MQQT協議服務端客戶端
- 利用tirpc庫實現簡單的客戶端和服務端RPC客戶端服務端
- 服務端渲染和客戶端渲染服務端客戶端
- 服務端指南 | 檔案許可權管理剖析服務端
- Visual C++ 6.0專案檔案型別簡介C++型別