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

编译时要链接操作系统的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. 如何一步步在生产环境上部署django和vue

    本文由云+社区发表 本文主要讲述了如何一步步在生产环境上部署django和vue,操作系统默认为centos 说明:后文中出现的以下字符串均表示具体的路径或者名称,含义如下: DJANGO_DIR-- ...

  2. Ubuntu环境下mysql常见的操作

    1    启动mysql服务:Service mysql start 再次启动:service mysql restart 停止mysql服务:service mysql stop 确定mysql是否 ...

  3. 【Python】正则表达式简单教程

    说明:本文主要是根据廖雪峰网站的正则表达式教程学习,并根据需要做了少许修改,此处记录下来以备后续查看. <Python正则表达式纯代码极简教程>链接:https://www.cnblogs ...

  4. ACM菜鸡退役帖——ACM究竟给了我什么?

    这个ACM退役帖,诸多原因(一言难尽...),终于决定在我大三下学期开始的时候写出来.下面说两个重要的原因. 其一是觉得菜鸡的ACM之旅没人会看的,但是新学期开始了,总结一下,只为了更好的出发吧. 其 ...

  5. 弹窗查看内容时 内容滚动区域设置为body区

    看到渣浪的查看文章或者查看大图有个效果:弹窗查看内容时,如果内容过长有滚动条,则滚动条会被放到body区滚动 什么意思呢? 看个图片,一般正常弹窗是有宽高限制的,如果内容过长则直接在弹窗中进行滚动 点 ...

  6. OJ:又一道考察多态的题目

    Description 下面的程序输出结果是: A::Fun A::Do A::Fun C::Do 请填空: 程序代码如下 #include <iostream> using namesp ...

  7. DNS域名解析之搭建公司内部域--技术流ken

    什么是DNS DNS( Domain Name System)是“域名系统”的英文缩写,是一种组织成域层次结构的计算机和网络服务命名系统,它用于TCP/IP网络,它所提供的服务是用来将主机名和域名转换 ...

  8. ResourceOwnerPassword模式使用数据库.

    有时候, ResourceOwnerPassword模式有用的, 可以用来代替我们原来管理程序的开发方式. 因为管理程序本身拥有用户数据的权限嘛, 并不是第三方应用, 无需要授权 集成很简单. 1. ...

  9. VM虚拟机Linux和主机数据传输

    虚拟机 Linux CentOS7 vm和主机通信是利用 vm tools  点击安装 点击后系统内有一个 打开 把 拖到桌面 打开终端 cd /home/whoami/桌面 ls 查看这个.tar. ...

  10. js实现带上传进度的文件上传

    //获取文件筐的文件集合 var files = document.getElementById("file1").files; //创建FormData对象 相当于参数集合 存储 ...