首页 > 其他分享 >我的第一个套接字通信(基本多线程)....

我的第一个套接字通信(基本多线程)....

时间:2024-04-29 19:23:45浏览次数:20  
标签:include int list .... fd 接字 多线程 sizeof buff

前排叠个甲:为什么现在才学习到Linux套接字???我的回答是:大一玩了一年,大二开始接触C++,其中呢,大二上学习完了Qt,大二下才开始接触Linux,而在这期间,反复阅读了C++的特性源码....所以。

回归正题:直接放代码,没什么好说的,就那一套流程:
服务器端的代码:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <cstring>
#include <arpa/inet.h>
#include <iostream>
#include <thread>
#include <mutex>
#include <list>

typedef struct socketAndfd{
  struct sockaddr_in ip_port;  
  int _fd;
}client_info;

void do_thing(std::list<client_info>& list,const client_info info,int flag){
  //5.连接建立成功,打印客户端的IP和端口信息
  char ip_client[32];
  printf("客户端的IP:%s,端口:%d\n",inet_ntop(AF_INET,&info.ip_port.sin_addr.s_addr,ip_client,sizeof(ip_client)),ntohs(info.ip_port.sin_port));
  //6.通知
  while(1){
      //接受数据
      char buff[1024];
      memset(buff,0,sizeof(buff));
      int len=recv(info._fd,buff,sizeof(buff),0);
      if(len>0){
          printf("client say:%s\n",buff);
          send(info._fd,buff,len,0);   //重新发送回去
      }
      else if(0==len){
          printf("客户端已经断开了连接...\n");
          break;
      }
      else{
          printf("revc");
          break;
      }
  }
  //关闭文件描述符
  close(info._fd);
  auto it=list.begin();
  std::advance(it,flag);
  list.erase(it);
 }
int main()
{
  //1.创建监听用到的套接字
  int fd=socket(AF_INET,SOCK_STREAM,0);
  if(fd==-1){
      perror("socket");
      return -1;

  }
  //2.绑定本地的IP port
  struct sockaddr_in saddr;
  saddr.sin_family=AF_INET;
  saddr.sin_port=htons(9999);
  saddr.sin_addr.s_addr=INADDR_ANY;

  int ret=bind(fd,(struct sockaddr*)&saddr,sizeof(saddr));
  if(-1==ret){
      perror("bind");
      return -1;
  }
  //3.设置监听
  ret=listen(fd,128);
  if(-1==ret){
      perror("listen");
      return -1;
  }
  //链表维护多个客户端的信息
  std::list<client_info> list;
  //数组维护多个线程信息
  std::vector<std::thread> _thread;
  //指示器用以当一个线程结束时销毁链表资源
  int sizeof_list=0;
  //临时变量
  client_info temp;
  socklen_t ofsockaddr_in=sizeof(temp.ip_port);
  //4.阻塞并等待客户端的连接
  while(1){
      {
          int cfd=accept(fd,(struct sockaddr*)&(temp.ip_port),&ofsockaddr_in);
          temp._fd=cfd;
          list.push_back(temp);
      }
      if(-1==temp._fd){
        perror("accept");
        //销毁错误资源
        auto temp_it=list.begin();
        std::advance(temp_it,sizeof_list);
        list.erase(temp_it);
        continue;
      }
      //如果有新的连接,开启一个新的线程
      else{
          auto temp_it=list.begin();
          std::advance(temp_it,sizeof_list);
          _thread.emplace_back(do_thing,std::ref(list),*(temp_it),sizeof_list);
          sizeof_list++;
      }
  }
  for(auto &it:_thread){
      it.join();
  }
  close(fd);
  return 0;
}

接下来是客户端的代码:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <arpa/inet.h>

int main()
{
    //1.创建通信用到的套接字
     int fd=socket(AF_INET,SOCK_STREAM,0);
     if(fd==-1){
        perror("socket");
        return -1;
    }
	//2.连接服务器IP port
	struct sockaddr_in saddr;
	saddr.sin_family=AF_INET;
	saddr.sin_port=htons(9999);
	inet_pton(AF_INET,"127.0.0.1",&saddr.sin_addr.s_addr);
	//3.连接服务器
	int ret=connect(fd,(struct sockaddr*)&saddr,sizeof(saddr));
	if(-1==ret){
		perror("connect");
		return -1;
	}
	//3.通知
	int number=0;
	while(1){ 
		//发送数据
		char buff[1024];
		sprintf(buff,"你好,服务器...%d\n",number++);
		send(fd,buff,strlen(buff)+1,0);
		//接受数据
		memset(buff,0,sizeof(buff));
		int len=recv(fd,buff,sizeof(buff),0);
		if(len>0){
			printf("server says:%s\n",buff);
		}
		else if(0==len){
			printf("Server端已经断开了连接...\n");
			break;
		}
		else{
			printf("revc");
			break;
		}
		sleep(1);
	}
	//关闭文件描述符
	close(fd);
	return 0;
}

标签:include,int,list,....,fd,接字,多线程,sizeof,buff
From: https://www.cnblogs.com/LLJR/p/18166523

相关文章

  • Python多线程编程深度探索:从入门到实战
    title:Python多线程编程深度探索:从入门到实战date:2024/4/2818:57:17updated:2024/4/2818:57:17categories:后端开发tags:多线程并发编程线程安全Python异步IO性能优化实战项目第1章:Python基础知识与多线程概念Python简介:Python是一种高级、通用、解释......
  • Java 多线程初步总结
    Java多线程程序,进程,线程的基本概念:程序:是为了完成特定的任务,使用某种语言编写的一组指令的集合,是一段静态的代码,静态对象,如Excel,World等。进程:是程序的一次执行多次,或者是正在运行的一个程序,是一个动态的过程,有自身的产生,存在和消亡的过程,即存在生命周期。线程:进程可以进一步......
  • 陈畅亮搞的专利在Windows上利用加解密DLL模块对数据库连接字符串进行加解密
    陈畅亮搞的专利在Windows上利用加解密DLL模块对数据库连接字符串进行加解密  这种专利权人是公司,个人是发明人,专利年费是申请人先垫付,然后公司报销了,这个专利本身就不属于员工的这个是公司是专利权人, 使用权是公司,如果想要维持权利的话,需要缴纳年费,专利发明现在一个市......
  • openharmony 多线程的方式有哪些?两个worker线程数据如何通讯、内存如何共享、与Java多
    OpenHarmony操作系统支持多种多线程并发处理策略,以提升应用的响应速度与帧率,以及防止耗时任务对主线程的干扰。以下是OpenHarmony中的多线程方式,以及Worker线程间的数据通讯和内存共享方法,还有它们与Java多线程的区别:OpenHarmony多线程方式Worker线程:OpenHarmony中的Worker是......
  • gdb 根据c语言二进制文件进程号查看内部多线程任务
    C语言二进制文件a编译时添加了-g(gdb调试),但是gdba这种方式有时不容易复现一些场景。这时可以先正常启动a,然后根据a的进程号启动gdb调试。#1.找到程序进程号psaux|grepa#2.使用GDB附加到该进程sudogdb-p[PID]#3.使用infothreads命令来列出......
  • python多线程
    多线程的原理是在同一进程内创建多个线程来执行不同的任务,这些线程共享同一进程的资源,包括内存空间、文件句柄等。每个线程拥有独立的执行路径,可以并行执行任务,从而提高程序的效率。在代码中,通过调用threading.Thread类创建了多个线程对象。每个线程对象都有一个target参数......
  • 【python】pyqt中使用多线程处理耗时任务
    在PyQt中使用多线程通常是为了避免界面冻结,特别是在执行耗时的任务时。PyQt本身是基于Qt的,而Qt不允许在除主线程之外的线程中直接操作GUI元素。因此,任何涉及GUI更新的操作都应该在主线程中执行。importsysimportthreadingfromPyQt5.QtWidgetsimportQApplic......
  • 深入理解多线程编程
    title:深入理解多线程编程date:2024/4/2517:32:02updated:2024/4/2517:32:02categories:后端开发tags:线程同步互斥锁死锁避免竞态条件线程池异步编程性能优化第一章:多线程基础1.1线程概念与原理线程:在操作系统中,一个程序可以被划分为多个执行流,每个......
  • Qt 中多线程对应的信号槽
    Qt中通过moveToThread方式来实现的多线程之间数据交互一般是通过信号槽来进行的,信号槽不仅可以用于同一个线程中,也可以用于多线程之间,当用于多线程之间时,其连接方式为Qt::QueuedConnection,即队列连接。多线程之间建立的信号槽主要为如下两个:主线程发送信号:来触发子线程的......
  • python 一个开箱即用的多线程代码
    适合数据采集的多线程代码!#coding=utf-8#coding=gbk#coding=gb2312importrequestsimportthreadingimportqueuedefget_response(source):returnresponsedefdecode(source,response):##保存数据passdefmains():whileTrue:......