c/c++ 网络编程与多线程 编译参数
网络编程与多线程 编译参数
编译时要链接操作系统的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);
}
c/c++ 学习互助QQ群:877684253

本人微信:xiaoshitou5854
c/c++ 网络编程与多线程 编译参数的更多相关文章
- TCP/IP网络编程之多线程服务端的实现(二)
线程存在的问题和临界区 上一章TCP/IP网络编程之多线程服务端的实现(一)的thread4.c中,我们发现多线程对同一变量进行加减,最后的结果居然不是我们预料之内的.其实,如果多执行几次程序,会发现 ...
- 网络编程之多线程——GIL全局解释器锁
网络编程之多线程--GIL全局解释器锁 一.引子 定义: In CPython, the global interpreter lock, or GIL, is a mutex that preven ...
- python入门(九):网络编程和多线程
一.网络编程 Socket简介 Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯. ...
- java 25 - 5 网络编程之多线程实现聊天室
平时聊天都是在同一个窗口的,所以,这个窗口同时实现发送数据和接收数据,这时就需要多线程实现. 建立一个类: 把聊天的发送端和接收端放在同一个类,启动一个窗口 public class CharRoom ...
- Linux网络编程echo多线程服务器
echo_server服务器多线程版本 #include <unistd.h> #include <stdlib.h> #include <stdio.h> #in ...
- 【Python网络编程】多线程聊天软件程序
课程设计的时候制作的多线程聊天软件程序 基于python3.4.3 import socket import pickle import threading import tkinter import ...
- {网络编程}和{多线程}应用:基于UDP协议【实现多发送方发送数据到同一个接收者】--练习
要求: 使用多线程实现多发送方发送数据到同一个接收者 代码: 发送端:可以在多台电脑上启动发送端,同时向接收端发送数据 注意:匹配地址和端口号 package com.qf.demo; import ...
- {网络编程}和{多线程}应用:基于TCP协议【实现多个客户端发送文件给一个服务器端】--练习
要求: 实现多个客户端发送文件给一个服务器端 提示:多个人创建客户端发送文件,服务端循环接收socket,从socket中获取文件 说明:这里我们只要建立一个服务端就可以了,然后让多台电脑使用客户端给 ...
- TCP/IP网络编程之多线程服务端的实现(一)
为什么引入线程 为了实现服务端并发处理客户端请求,我们介绍了多进程模型.select和epoll,这三种办法各有优缺点.创建(复制)进程的工作本身会给操作系统带来相当沉重的负担.而且,每个进程有独立的 ...
随机推荐
- Perl语法的基本规则
因为是比较凌乱的用法规则收集,所以能看懂则看,不能看懂也无所谓.以后也会遇到. Perl脚本第一行使用#!.Perl的后缀名一般为".plx"或".pl",运行 ...
- SpringBoot系列——aop 面向切面
前言 项目中我们经常会用到aop切面,比如日志记录:这里简单记录一下springboot是如何使用aop spring对aop的配置,来自springboot参考手册,Common applicati ...
- CheckForIllegalCrossThreadCalls = false 是干嘛的?
public Form1() { InitializeComponent(); CheckForIllegalCrossThreadCalls = false; } 在多线 ...
- Webapi创建和使用 以及填坑(三)
WebApi使用填坑 前面工作跟别人做数据对接,因为我们是对接方所以东西都得按照他们的要求进行修改,于是给自己挖了很多坑,其实更多的都是自己能力还不够,在这里也做一个笔记了. 请求类型:applica ...
- C# 读写App.config配置文件
一.C#项目中添加App.config配置文件 在控制台程序中,默认会有一个App.config配置文件,如果不小心删除掉,或者其他程序需要配置文件,可以通过添加得到. 添加步骤:右键项目名称,选择“ ...
- 16.QT-QMap和QHash解析
QMap QMap原型为class QMap <K,T>,其中K表示键,T表示值,K和T属于映射关系. QMap会根据K来自动进行升序键排序 QMap中的K类型必须重载operator & ...
- oracle中rownum的使用
rownum是系统的一个关键字,表示行号,是系统自动分配的,第一条符合要求的数据行号就是1,第二条符合要求的数据行号就是2. Rownum 不能直接使用 例:取前多少条数据: 取中间的一些数据: se ...
- Hibernate入门(六)---------HQL语句
Query: 代表面向对象的一个Hibernate查询操作.在Hibernate中,通常使用session.createQuery()方法接收一个HQL语句,然后调用Query的 list()或uni ...
- vim 学习笔记系列(前言)
今天上午的时候,看到大神在用vim编程,画面直观,速度很快,操作只需要用命令符就可以实施. 所以可以推断vim的命令符是复杂的,那么学习过程中记忆会很漫长,很痛苦,但是如果记住了这些命令符,并可以熟练 ...
- react学习(二)之通信篇
react性能提升原理:虚拟DOM react把真是的DOM tree,转化成virtual DOM,每次数据更新后,重新计算virtual DOM并与上一次的作对比,然后对发生改变的部分进行批量更新 ...