博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
socket 编程入门教程(一)TCP server 端:8、本章的完整源代码
阅读量:5878 次
发布时间:2019-06-19

本文共 2242 字,大约阅读时间需要 7 分钟。

hot3.png

//Filename: TcpServerClass.hpp

#ifndef TCPSERVERCLASS_HPP_INCLUDED
#define TCPSERVERCLASS_HPP_INCLUDED
#include 
<unistd.h>
#include 
<iostream>
#include 
<sys/socket.h>
#include 
<arpa/inet.h>
class TcpServer
{
private:
    
int listenSock;
    
int communicationSock;
    sockaddr_in servAddr;
    sockaddr_in clntAddr;
public:
    TcpServer(
int listen_port);
    
bool isAccept();
    
void handleEcho();
};
#endif // TCPSERVERCLASS_HPP_INCLUDED

//Filename: TcpServerClass.cpp

#include 
"TcpServerClass.hpp"
TcpServer::TcpServer(
int listen_port)
{
    
if ( (listenSock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0 ) {
        
throw "socket() failed";
    }
    memset(
&servAddr, 0sizeof(servAddr));
    servAddr.sin_family 
= AF_INET;
    servAddr.sin_addr.s_addr 
= htonl(INADDR_ANY);
    servAddr.sin_port 
= htons(listen_port);
    
if ( bind(listenSock, (sockaddr*)&servAddr, sizeof(servAddr)) < 0 ) {
        
throw "bind() failed";
    }
    
if ( listen(listenSock, 10< 0 ) {
        
throw "listen() failed";
    }
}
bool TcpServer::isAccept()
{
    unsigned 
int clntAddrLen = sizeof(clntAddr);
    
if ( (communicationSock = accept(listenSock, (sockaddr*)&clntAddr, &clntAddrLen)) < 0 ) {
        
return false;
    } 
else {
        std::cout 
<< "Client(IP: " << inet_ntoa(clntAddr.sin_addr) << ") connected.\n";
        
return true;
    }
}
void TcpServer::handleEcho()
{
    
const int BUFFERSIZE = 32;
    
char buffer[BUFFERSIZE];
    
int recvMsgSize;
    
bool goon = true;
    
while ( goon == true ) {
        
if ( (recvMsgSize = recv(communicationSock, buffer, BUFFERSIZE, 0)) < 0 ) {
            
throw "recv() failed";
        } 
else if ( recvMsgSize == 0 ) {
            goon 
= false;
        } 
else {
            
if ( send(communicationSock, buffer, recvMsgSize, 0!= recvMsgSize ) {
                
throw "send() failed";
            }
        }
    }
    close(communicationSock);
}

演示程序:

//Filename: main.cpp

//Tcp Server C++ style, single work
#include 
<iostream>
#include 
"TcpServerClass.hpp"
int echo_server(int argc, char* argv[]);
int main(int argc, char* argv[])
{
    
int mainRtn = 0;
    
try {
        mainRtn 
= echo_server(argc, argv);
    }
    
catch ( const char* s ) {
        perror(s);
        exit(EXIT_FAILURE);
    }
    
return mainRtn;
}
int echo_server(int argc, char* argv[])
{
    
int port;
    
if ( argc == 2 ) {
        port 
= atoi(argv[1]);
    } 
else {
        port 
= 5000;
    }
    TcpServer myServ(port);
    
while ( true ) {
        
if ( myServ.isAccept() == true ) {
            myServ.handleEcho();
        }
    }
    
return 0;
}

转载于:https://my.oschina.net/GeorgeSu/blog/264183

你可能感兴趣的文章
CURL访问举例
查看>>
Vue 全选/取消全选,反选/取消反选
查看>>
thinkphp实现导航高亮的简单方法
查看>>
sp 获取数据库文件路径,用于暴力迁移服务器
查看>>
体现临床实际基线疾病活动度的早期RA患者中, 治疗起效时间对临床和放射学的影响...
查看>>
强直性脊柱炎活动指数(ASDAS)在日常诊疗种评估生物制剂治疗患者的应用-来自葡萄牙登记系统风湿病患者...
查看>>
RH133读书笔记(11)-Lab 11 System Rescue and Troubleshooting
查看>>
C# Winform 大全开发手册
查看>>
Mysql中一级缓存二级缓存区别
查看>>
面试题--在一个字符串中查找重复次数最多的字符(转)
查看>>
QTP的那些事--有关qtp中的action模板的使用
查看>>
VBS进价编程必须学会的WMI介绍
查看>>
常见Failed to load ApplicationContext异常解决方案!!
查看>>
Activiti 各个节点涉及的表
查看>>
POJ 2373 Dividing the Path (单调队列优化DP)题解
查看>>
小程序之web-view打开外部链接
查看>>
转|poj2234maches game|博弈论
查看>>
删除公共字符
查看>>
Layout入门
查看>>
原生js操作类名
查看>>