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. 仙剑4CPK加密解密算法(转)

    // RSTEncDec.h: interface for the CRSTEncDec class. // ///////////////////////////////////////////// ...

  2. 安装篇六:安装PHP(7.2.29版本)

    准备环境,下载依赖软件 # No1:在前面安装好的基础上,关闭iptables.selinux # No2:安装依赖包 yum install zlib-devel bzip2-devel -y &l ...

  3. Backdrop Filter

    CSS 滤镜 : backdrop-filter backdrop filter属性允许我们使用css对元素后面的内容应用过滤效果. 滤镜: 名称: 方法案例: 效果: blur() 模糊 filte ...

  4. 高端面试必备:一个Java对象占用多大内存

    这个问题一般会出现在稍微高端一点的 Java 面试环节.要求面试者不仅对 Java 基础知识熟悉,更重要的是要了解内存模型. Java 对象模型 HotSpot JVM 使用名为 oops (Ordi ...

  5. [leetcode]187. Repeated DNA Sequences寻找DNA中重复出现的子串

    很重要的一道题 题型适合在面试的时候考 位操作和哈希表结合 public List<String> findRepeatedDnaSequences(String s) { /* 寻找出现 ...

  6. 686. Repeated String Match判断字符串重复几次可以包含另外一个

    public static int repeatedStringMatch(String A, String B) { //判断字符串a重复几次可以包含另外一个字符串b,就是不断叠加字符串a直到长度大 ...

  7. JavaSwing 船只停靠管理可视化(二)

    JavaSwing 船只停靠管理可视化(一) JavaSwing 船只停靠管理可视化(二) JavaSwing 船只停靠管理可视化(三) JavaSwing 船只停靠管理可视化(四) JavaSwin ...

  8. ta-lib安装问题

    不管是windows还是linux,直接使用pip install ta-lib都会出现各种各样的问题,如下图: 解决办法,从网上找了很多办法都不好用,最后发现直接从晚上down .whl的文件,然后 ...

  9. vue中使用AES.js和crypto.js加密

    一:crypto-js加密 1.1:安装依赖 npm install crypto-js --save-dev 1.2 :在项目目录上创建一个js文件里面写入加密,解密的代码 mport Crypto ...

  10. String StringBuffer StringBuilder之间的区别

    String: