网络编程与多线程 编译参数

编译时要链接操作系统的pthread库

g++ -g socket01.cpp -std=c++11 -pthread

不加-pthread的话,出现下面的错误:

terminate called after throwing an instance of 'std::system_error'
what(): Enable multithreading to use std::thread: Operation not permit
ted

例子:

#include <sys/types.h>//socket()
#include <sys/socket.h>//socket()
#include <unistd.h>//close()
#include <arpa/inet.h>//结构体sockaddr_in
#include <string.h>//函数strstr
#include <iostream>
#include <thread> using namespace std; class TcpThread{
public:
void main(){
cout << "in tread main !!!!!!!!!!!!!!" << endl;
char buf[1024] = {0};
while(true){
//虽然指定了接收数据的大小为sizeof(buf) - 1,
//但实际能接收到多少,是不一定的,
//len1是实际接到的数据的大小
int len1 = recv(client, buf, sizeof(buf) - 1, 0);
cout << "recv len is : " << len1 << endl;
if(len1 <= 0) break;
buf[len1] = '\0';
if(strstr(buf, "quit") != NULL){
char re[] = "quit sucess\n";
send(client, re, strlen(re) + 1, 0);
break;
}
//给客户端发送信息,如果发送的数据大,会自动被切割车成很多小块
//分多次发出去
//虽然指定了发送数据的大小为3,
//但实际能发出去多少,是不一定的,
//sendlen是实际发送出去的数据的大小
int sendlen = send(client, "OK\n", 4, 0);
cout << "send len is : " << sendlen << endl;
cout << "recv is : " << buf << endl; }
close(client);
delete this;
}
int client = 0;
};
int main(int argc, char* argv[]){ unsigned short port = 8080;
int sock = socket(AF_INET,SOCK_STREAM,0);
if(argc > 1){
port = atoi(argv[1]);
}
sockaddr_in saddr;
saddr.sin_family = AF_INET;
//把本地字节序,转成网络字节序
saddr.sin_port = htons(port);
saddr.sin_addr.s_addr = htonl(0);
if(bind(sock,(sockaddr*)&saddr, sizeof(saddr)) != 0){
cout << "bind failed" << endl;
return -2;
}
cout << "success:" << port << endl;
listen(sock, 10);
while(true){
sockaddr_in caddr;
socklen_t len = sizeof(caddr);
//根据原来的sock,生成一个新的socket,叫clinet
//原来的sock是专门用来建立连接的
int client = accept(sock, (sockaddr*)&caddr, &len);
if(client <= 0)break;
cout << client << endl;
char *ip = inet_ntoa(caddr.sin_addr);
//把网络字节序,转成本地字节序
unsigned short cport = ntohs(caddr.sin_port);
cout << "clinet ip is " << ip << " port is " << cport << endl; TcpThread* th = new TcpThread();
th->client = client; //开启多线程
std::thread sth(&TcpThread::main, th);
//让子线程脱离父线程的监管
sth.detach();
}
close(sock);
}

github源代码

c/c++ 学习互助QQ群:877684253

本人微信:xiaoshitou5854

c/c++ 网络编程与多线程 编译参数的更多相关文章

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

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

  2. 网络编程之多线程——GIL全局解释器锁

    网络编程之多线程--GIL全局解释器锁 一.引子 定义: In CPython, the global interpreter lock, or GIL, is a mutex that preven ...

  3. python入门(九):网络编程和多线程

    一.网络编程 Socket简介 Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯. ...

  4. java 25 - 5 网络编程之多线程实现聊天室

    平时聊天都是在同一个窗口的,所以,这个窗口同时实现发送数据和接收数据,这时就需要多线程实现. 建立一个类: 把聊天的发送端和接收端放在同一个类,启动一个窗口 public class CharRoom ...

  5. Linux网络编程echo多线程服务器

    echo_server服务器多线程版本 #include <unistd.h> #include <stdlib.h> #include <stdio.h> #in ...

  6. 【Python网络编程】多线程聊天软件程序

    课程设计的时候制作的多线程聊天软件程序 基于python3.4.3 import socket import pickle import threading import tkinter import ...

  7. {网络编程}和{多线程}应用:基于UDP协议【实现多发送方发送数据到同一个接收者】--练习

    要求: 使用多线程实现多发送方发送数据到同一个接收者 代码: 发送端:可以在多台电脑上启动发送端,同时向接收端发送数据 注意:匹配地址和端口号 package com.qf.demo; import ...

  8. {网络编程}和{多线程}应用:基于TCP协议【实现多个客户端发送文件给一个服务器端】--练习

    要求: 实现多个客户端发送文件给一个服务器端 提示:多个人创建客户端发送文件,服务端循环接收socket,从socket中获取文件 说明:这里我们只要建立一个服务端就可以了,然后让多台电脑使用客户端给 ...

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

    为什么引入线程 为了实现服务端并发处理客户端请求,我们介绍了多进程模型.select和epoll,这三种办法各有优缺点.创建(复制)进程的工作本身会给操作系统带来相当沉重的负担.而且,每个进程有独立的 ...

随机推荐

  1. Nginx下关于缓存控制字段cache-control的配置说明 - 运维小结

    HTTP协议的Cache -Control指定请求和响应遵循的缓存机制.在请求消息或响应消息中设置 Cache-Control并不会影响另一个消息处理过程中的缓存处理过程.请求时的缓存指令包括: no ...

  2. openssl dhparam(密钥交换)

    openssl系列文章:http://www.cnblogs.com/f-ck-need-u/p/7048359.html openssl dhparam用于生成和管理dh文件.dh(Diffie-H ...

  3. 加密的m3u8、ts文件合并

    加密后的ts文件不能直接合并或播放,需要使用key对每个ts文件进行解密. 分为两种情况: (1).如果ts文件已经全部下载好,则可以直接在本地通过ffmpeg快速解密合并. (2).如果ts文件没有 ...

  4. for 循环 和 Array 数组对象

    博客地址:https://ainyi.com/12 for 循环 和 Array 数组对象方法 for for-in for-of forEach效率比较 - 四种循环,遍历长度为 1000000 的 ...

  5. C#语言中字段和属性相关知识剖析

    针对C#中的字段和属性,很多初学者无法区分这两者之间的区别. 字段与属性比较 字段;是一种“成员变量”,一般在类的内部做数据交互使用,占用内存空间. 属性:a.是一种逻辑变量,一般跟字段一起结合起来使 ...

  6. mybatis_15整合ehcache

    3.4 整合ehcache Mybatis本身是一个持久层框架,它不是专门的缓存框架,所以它对缓存的实现不够好,不能支持分布式. Ehcache是一个分布式的缓存框架. 什么是分布式 系统为了提高性能 ...

  7. JDK动态代理简单使用(2)

    JDK动态代理使用: 使用JDK动态代理步骤: ①创建被代理的接口和类: public interface IA { void f1(String param); } public class A i ...

  8. Docker多步构建更小的Java镜像

    译者按: 最新版Docker将支持多步构建(Multi-stage build),这样使用单个Dockerfile就可以定义多个中间镜像用于构建,测试以及发布等多个步骤,并且有效减小最终镜像的大小. ...

  9. GA中的术语及经常分析的指标

    GA中的术语 跳出客流:只浏览了网站的一个页面,并且没有进一步动作的访客目标转化:通常缩写为目标或转化,这是网站上面的一个预期或动作,通常被认为比标准网页更有价值,例如:"确认购买" ...

  10. Oracle+mybatis实现对数据的简单增删改查

    第一步:--创建一个表空间:名字叫 mybatis,建在D盘下的date文件夹下: 第二步:创建用户,名字叫  lisi  ,密码为  :123456 第三步:给用户授权: 第四步:我们在    li ...