1. 服务端

#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <iostream>
#include <forward_list>
#include <thread> class Server {
constexpr static int DEFAULT_BACKLOG = 10;
public:
Server(): _listener(-1), _should_exit(false) {}
~Server() {
for (auto it = _threads.begin(); it != _threads.end(); it++) {
it->join();
}
} // 判断 server 是否有效
operator bool() const {
return _listener != -1;
} // 监听并接受连接
void listen_and_serve(unsigned short port, int backlog= DEFAULT_BACKLOG) {
// 创建套接字
_listener = socket(AF_INET, SOCK_STREAM, 0);
if (_listener == -1) {
std::cerr << "cannot create listener\n";
return;
} // 设置套接字选项
int value = 1;
if (setsockopt(_listener, SOL_SOCKET, SO_REUSEADDR, &value, sizeof(value)) == -1) {
std::cerr << "cannot set option: reuse_address\n";
} // 绑定地址
struct sockaddr_in addr;
memset(&addr, 0, sizeof(sockaddr_in));
addr.sin_family = AF_INET;
addr.sin_port = htons(port);
addr.sin_addr.s_addr = htonl(INADDR_ANY);
if (bind(_listener, (struct sockaddr*)&addr, sizeof(addr)) == -1) {
std::cerr << "bind failed\n";
return;
} // 监听连接
if (listen(_listener, backlog) == -1) {
std::cerr << "listen failed\n";
return;
} int conn;
std::cout << "listening ...\n"; // 接受连接
while (!_should_exit) {
conn = accept(_listener, NULL, NULL);
if (conn == -1) {
std::cerr << "accept failed\n";
} _threads.push_front(std::thread(Server::handle_connection, conn));
}
} // 关闭套接字
void close() {
_should_exit = true;
::close(_listener);
} // 处理连接
static void handle_connection(int conn) {
char buf[16] = { 0 };
int n = recv(conn, buf, sizeof(buf), 0);
send(conn, buf, n, 0);
::close(conn);
} private:
int _listener;
std::forward_list<std::thread> _threads;
bool _should_exit;
}; Server server; // 信号处理器
void handler(int signum) {
std::cout << "exit ...\n";
if (server) {
server.close();
}
exit(EXIT_SUCCESS);
} int main() {
// 处理 ctrl+c
signal(SIGINT, handler); server.listen_and_serve(6666);
}

2. 客户端

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <stdint.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h> const char* SERVER_IP = "127.0.0.1";
const short SERVER_PORT = 6666; int main() {
int sockfd;
struct sockaddr_in addr; // 创建套接字
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd == -1) {
printf("socket: %s\n", strerror(errno));
return 1;
} // 发起连接
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(SERVER_PORT);
if (inet_pton(AF_INET, SERVER_IP, &addr.sin_addr) <= 0) {
printf("inet_pton: %s\n", strerror(errno));
return 1;
} if (connect(sockfd, (const struct sockaddr*)&addr, sizeof(addr)) < 0) {
printf("connect: %s\n", strerror(errno));
return 1;
} // 发送、接收数据
const char* msg = "hello";
char buf[16] = { 0 };
send(sockfd, msg, strlen(msg), 0);
int n = recv(sockfd, buf, sizeof(buf), 0);
printf("%s\n", buf); close(sockfd);
return 0;
}

网络编程 — Linux TCP服务端和客户端的更多相关文章

  1. 网络编程 — Windows TCP服务端和客户端

    1. 服务端 #include <iostream> #include <signal.h> #include <forward_list> #include &l ...

  2. python网络编程:socket、服务端、客户端

    本文内容: socket介绍 TCP: 服务端 客户端 UDP: 服务端 客户端 首发时间:2018-02-08 01:14 修改: 2018-03-20 :重置了布局,增加了UDP 什么是socke ...

  3. python网络编程-TCP服务端的开发

    #TCP服务端开发 2 #方法说明 3 """ 4 bind(host,port)表示绑定端口号,host是ip地址,ip地址一般不进 行绑定,表示本机的任何一个ip地址 ...

  4. [javaSE] 网络编程(TCP服务端客户端互访阻塞)

    客户端给服务端发送数据,服务端收到数据后,给客户端反馈数据 客户端: 获取Socket对象,new出来,构造参数:String的ip地址,int的端口号 调用Socket对象的getOutputStr ...

  5. TCP/IP网络编程之多线程服务端的实现(二)

    线程存在的问题和临界区 上一章TCP/IP网络编程之多线程服务端的实现(一)的thread4.c中,我们发现多线程对同一变量进行加减,最后的结果居然不是我们预料之内的.其实,如果多执行几次程序,会发现 ...

  6. TCP/IP网络编程之多进程服务端(二)

    信号处理 本章接上一章TCP/IP网络编程之多进程服务端(一),在上一章中,我们介绍了进程的创建和销毁,以及如何销毁僵尸进程.前面我们讲过,waitpid是非阻塞等待子进程销毁的函数,但有一个不好的缺 ...

  7. 基于Select模型的Windows TCP服务端和客户端程序示例

    最近跟着刘远东老师的<C++百万并发网络通信引擎架构与实现(服务端.客户端.跨平台)>,Bilibili视频地址为C++百万并发网络通信引擎架构与实现(服务端.客户端.跨平台),重新复习下 ...

  8. 【转】TCP/UDP简易通信框架源码,支持轻松管理多个TCP服务端(客户端)、UDP客户端

    [转]TCP/UDP简易通信框架源码,支持轻松管理多个TCP服务端(客户端).UDP客户端 目录 说明 TCP/UDP通信主要结构 管理多个Socket的解决方案 框架中TCP部分的使用 框架中UDP ...

  9. swoole创建TCP服务端和客户端

    服务端: server.php <?php //创建Server对象,监听 127.0.0.1:9501端口    $serv = new swoole_server("127.0.0 ...

随机推荐

  1. 【剑指offer】00 开撸剑指offer

    此篇为刷题链接集合,我会将剑指offer中的每一题单独做一篇随笔,然后将链接加在本篇随笔中. //将用JavaScript解题 剑指offer:https://www.nowcoder.com/ta/ ...

  2. iOS音乐电台类项目开发

    1.技术难度不是太大,代码大致如下 2.用到的一些第三方 ZFProgressView,pageController,RESideMenu,MJRefresh,MBProgressHUD,RNFros ...

  3. 6.mysql存储过程

    存储过程 1.命令 创建及调用 定义分隔符 DELIMITER $ 创建存储过程 delimiter $$ create procedure 名称() begin 语句 end$$ delimiter ...

  4. Ubuntu Server 16.04.1 LTS 64位 搭建LNMP环境

    安装配置 Nginx 为了确保获得最新的 Nginx,先使用sudo apt-get update命令更新源列表.安装 Nginx,输入命令:sudo apt-get install nginx. 启 ...

  5. Json串的字段如果和类中字段不一致,如何映射、转换?

    Json串是我们现在经常会遇到的一种描述对象的字符串格式.在用Java语言开发的功能中,也经常需要做Json串与Java对象之间的转换. fastjson就是经常用来做Json串与Java对象之间的转 ...

  6. 工作中用的sql

    //字段是空字符串或者null select * from blade_process_should_pay_invoice where is_deleted = 0 and process_inst ...

  7. Nginx压力测试问题

    [root@aa~]# This is ApacheBench, Version 2.3 <Revision:655654Revision:655654> Copyright 1996 A ...

  8. 一文掌握XSS

    目录 XSS跨站脚本攻击 1.什么叫跨站脚本攻击? 2.XSS跨站脚本攻击的原理 3.XSS跨站脚本攻击的目的是什么? 4.XSS跨站脚本攻击出现的原因 5.XSS跨站脚本攻击的条件 1.有输入有输出 ...

  9. 第十章节 BJROBOT PID 动态调节【ROS全开源阿克曼转向智能网联无人驾驶车】

    1.把小车架空,平放在地板上,注意四个轮子一定要悬空.用资料里的虚拟机,打开一个终端 ssh 过去主控端启动 roslaunch znjrobot bringup.launch.   2.在虚拟机端再 ...

  10. log4j2文件结构

    标签结构 Configuration properties Appenders Console PatternLayout File RollingRandomAccessFile Filters T ...