首页 > 其他分享 >多线程TCP的一些问题

多线程TCP的一些问题

时间:2024-04-30 22:22:21浏览次数:16  
标签:std sockaddr ad ip TCP 线程 remotelen 一些 多线程

使用循环堵塞等待客户端连接,连接到一个就开一条线程,当用以下代码,即每次ad重新初始化后其地址作为实参进行线程的创建,结果就是当有新客户端连接,开了新线程时,旧线程看起来会被停止,实际上是因为ad用了地址而不是值作为实参,所以当新连接进来时,ad的值被更改,但地址不变,旧线程所使用的ad内的值也随之变换,使得不同线程所使用的ad是一样的。

    while(1)
    {
        socklen_t remotelen = sizeof(struct sockaddr);
        int ad = accept(sd,(sockaddr *)&remote_ip,&remotelen);
        if(ad == -1)
        {
            std::cout<<"accept remote ip fail"<<errno<<std::endl;
            return -1;
        }
        
        pthread_t tid;
        int ret = pthread_create(&tid,NULL,recvthread,(void *)&ad);
        if(ret == -1)
        {
            std::cout<<"create thread fail"<<std::endl;
            close(ad);
        }
    }

所以需要保留每个ad的值,比如用数组

    int i=0;
    while(1)
    {
        socklen_t remotelen = sizeof(struct sockaddr);
        ad[i] = accept(sd,(sockaddr *)&remote_ip,&remotelen);
        if(ad[i] == -1)
        {
            std::cout<<"accept remote ip fail"<<errno<<std::endl;
            return -1;
        }
        
        pthread_t tid;
        int ret = pthread_create(&tid,NULL,recvthread,(void *)&ad[i]);
        if(ret == -1)
        {
            std::cout<<"create thread fail"<<std::endl;
            close(ad[i]);
        }
        i++;
    }

 

while(1) { socklen_t remotelen = sizeof(struct sockaddr); ad[i] = accept(sd,(sockaddr *)&remote_ip,&remotelen); if(ad[i] == -1) { std::cout<<"accept remote ip fail"<<errno<<std::endl; return -1; }   pthread_t tid; int ret = pthread_create(&tid,NULL,recvthread,(void *)&ad[i]); if(ret == -1) { std::cout<<"create thread fail"<<std::endl; close(ad[i]); } i++; }

标签:std,sockaddr,ad,ip,TCP,线程,remotelen,一些,多线程
From: https://www.cnblogs.com/toriyung/p/18168781

相关文章

  • 关于我,与一些关于我的事
    大家好。你们有的人可能认识我,有的人可能不认识。我是cpchenpi(Codeforces、Atcoder同名),这个ID可能不是很好听,但也跟了我很长时间了。真名叫陈骆鑫(这种程度的隐私大概不算什么),目前(截至本文写作日期2024.04.30)是中国科学技术大学的一名大三学生。曾经是ICPC选手。2024年4......
  • 多线程
    1.相关概念程序(program):为完成特定任务,用某种语言编写的一组指令的集合。即指一段静态的代码,静态对象进程(process):程序的一次执行过程,或是正在内存中运行的应用程序。如:运行中的QQ,运行中的网易音乐播放器。线程(thread):进程可进一步细化为线程,是程序内部的一条执行路径。一个......
  • ffmpeg不同平台的一些编译脚本
    build-x86-64.sh:#!/bin/sh#编译后输出目录,在ffmpeg源码目录下的/android/arm64-v8aOUTPUT=$(pwd)/x86_64-linux/x64build(){./configure\--disable-x86asm\--prefix=$OUTPUT\--disable-static\--disable-debug\--disable-doc\--enable-shared\--en......
  • dbt dbt-audit-helper 包提供的一些方便macro
    dbt-audit-helper从字面意思是dbt的审计帮助工具,但是实际上我们也可以使用此工具做一些数据质量相关的东西dbt-audit-helper提供的macro比较数据输出包含了compare_relations,compare_queries,compare_row_counts比较列compare_column_values,cmpare_all_columns,com......
  • 我的第一个套接字通信(基本多线程)....
    前排叠个甲:为什么现在才学习到Linux套接字???我的回答是:大一玩了一年,大二开始接触C++,其中呢,大二上学习完了Qt,大二下才开始接触Linux,而在这期间,反复阅读了C++的特性源码....所以。回归正题:直接放代码,没什么好说的,就那一套流程:服务器端的代码:#include<stdio.h>#include<stdlib.h>......
  • TCP的三次握手与四次挥手
    TCP的三次握手(建立连接)和四次挥手(关闭连接) https://www.cnblogs.com/Jessy/p/3535612.html面试官,不要再问我三次握手和四次挥手https://juejin.cn/post/6844903958624878606 (这篇写得好)三次握手和四次挥手过程中的异常处理https://blog.csdn.net/qq_34827674/article/detai......
  • C++ 实现基于TCP的聊天室
    需求以及思路客户端启动以后,需要去连接服务端,并在控制台输入消息发送到服务端,服务端收到该消息后发送给所有已连接的客户端。所以客户端需要做的事情只有两个:接收用户输入并将其发送到服务端接收服务端消息并将其显示到控制台服务端要做的事情也是两个:接待新连接上的客户......
  • [转载]一些人士论文的学术指标[2017.4.26 from sina blog]
    大连海事大学贾欣乐教授博文。原文地址:一些人士论文的学术指标作者:贾欣乐    ......
  • Python多线程编程深度探索:从入门到实战
    title:Python多线程编程深度探索:从入门到实战date:2024/4/2818:57:17updated:2024/4/2818:57:17categories:后端开发tags:多线程并发编程线程安全Python异步IO性能优化实战项目第1章:Python基础知识与多线程概念Python简介:Python是一种高级、通用、解释......
  • 前缀和的一些笔记
    左神课程笔记,前缀和笔记,(前缀和也是想双指针一样管理两个指针之间的区间的)前缀和(前i个数的和)个人理解,把前缀和当成两个指针,维护一个区间,例如i-1到i这两个双指针之间管理的线段上放着一个a[i-1],感觉差分也能这样理解,a[i-1]-a[i]之间放着一个差分值下标i结......