首页 > 编程语言 >多线程网络编程

多线程网络编程

时间:2024-03-05 21:44:26浏览次数:21  
标签:sockaddr struct clientfd int 编程 网络 sockfd 多线程 客户端

创建tcp套接字

 1   // int socket(int domain, int type, int protocol); 
 2   //       - 功能:创建一个套接字 
 3   //       - 参数: 
 4   //               - domain: 协议族 
 5   //                       AF_INET : ipv4 
 6   //                       AF_INET6 : ipv6 
 7   //                       AF_UNIX, AF_LOCAL : 本地套接字通信(进程间通信) 
 8   //               - type: 通信过程中使用的协议类型 
 9   //                       SOCK_STREAM : 流式协议 
10   //                       SOCK_DGRAM : 报式协议 
11   //               - protocol : 具体的一个协议。一般写0 
12   //                       - SOCK_STREAM : 流式协议默认使用 TCP 
13   //                       - SOCK_DGRAM : 报式协议默认使用 UDP 
14   //               - 返回值: 
15   //                       - 成功:返回文件描述符,操作的就是内核缓冲区。 
16   //                       - 失败:-1
17   int sockfd = socket(AF_INET, SOCK_STREAM, 0);

绑定

 1   struct sockaddr_in serveraddr;
 2   memset(&serveraddr, 0, sizeof(struct sockaddr_in));
 3   serveraddr.sin_family = AF_INET;
 4   serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);
 5   serveraddr.sin_port = htons(2048);
 6 
 7   // int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen); // socket命 名
 8   //       - 功能:绑定,将fd 和本地的IP + 端口进行绑定
 9   //       - 参数:
10   //               - sockfd : 通过socket函数得到的文件描述符
11   //               - addr : 需要绑定的socket地址,这个地址封装了ip和端口号的信息
12   //               - addrlen : 第二个参数结构体占的内存大小
13   if(bind(sockfd,(struct sockaddr*)& serveraddr,sizeof(struct sockaddr)) == -1){
14     perror("bind");
15     return -1;
16   }

监听

1   // int listen(int sockfd, int backlog);      // /proc/sys/net/core/somaxconn 
2   //       - 功能:监听这个socket上的连接 
3   //       - 参数: 
4   //               - sockfd : 通过socket()函数得到的文件描述符 
5   //               - backlog : 未连接的和已经连接的和的最大值, 5
6   listen(sockfd, 0);

监听以后客户端就可以连接了

然后阻塞等待客户端连接,创建客户端套接字

 1     struct sockaddr_in clientaddr;
 2     socklen_t len = sizeof(clientaddr);
 3 
 4     // int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen); 
 5     //     - 功能:接收客户端连接,默认是一个阻塞的函数,阻塞等待客户端连接 
 6     //     - 参数: 
 7     //             - sockfd : 用于监听的文件描述符 
 8     //             - addr : 传出参数,记录了连接成功后客户端的地址信息(ip,port)
 9     //             - addrlen : 指定第二个参数的对应的内存大小 
10     //     - 返回值: 
11     //             - 成功 :用于通信的文件描述符 
12     //             - -1 : 失败 
13     int clientfd = accept(sockfd, (struct sockaddr *)&clientaddr, &len);

创建线程,接收客户端消息

1     pthread_t thid;
2     pthread_create(&thid, NULL, client_thread, &clientfd);

 

 1 void* client_thread(void* arg){
 2   int clientfd = *(int *)arg;
 3   while (1)
 4   {
 5     char buffer[128] = {0};
 6     int count = recv(clientfd, buffer, 128, 0);
 7     if (count == 0)
 8     {
 9       break;
10     }
11     // 将接收到的消息返回给客户端.
12     send(clientfd, buffer, count, 0);
13     printf("clientfd: %d, count: %d, buffer: %s\n", clientfd, count, buffer);
14   }
15 
16   close(clientfd);
17 }

 

标签:sockaddr,struct,clientfd,int,编程,网络,sockfd,多线程,客户端
From: https://www.cnblogs.com/anlingxiao/p/18055044

相关文章

  • 网络安全入门(持续更新...)
    第零章网络安全概述网络安全是什么网络安全基本要素(CIA)机密性(Confidentiality):确保一些重要信息/敏感数据不会被未授权访问(不会被窃取);完整性(Integrity):确保数据在传输过程中不会被篡改;可用性(Availability):确保已授权人员可以正常获取数据;网络安全关心什么网络通信安全:......
  • 网页浏览器Chrome开发者调试工具-Network(网络)
    前言全局说明网页浏览器Chrome开发者调试工具-Network(网络)一、网页浏览器Chrome开发者调试工具-Network(网络)网络标签页是对网页请求过程的监视,这里可以看到网页链接发送了什么请求,接收到了什么内容。都可以直观的看到二、关闭标签页在标签页上右键,可以选择移除或移......
  • 在Windows操作系统上进行端口映射通常需要使用网络地址转换(NAT)规则或端口转发来实现。
    端口映射通常与目的网络地址转换(DNAT)概念相关联。在网络中,DNAT是一种技术,用于将传入的数据包的目的IP地址和/或端口号修改为内部网络中另一台计算机的IP地址和端口号。这样可以实现将外部流量导向内部特定计算机或服务的功能。因此,端口映射通常涉及DNAT技术,用于在网络中重......
  • 网络功能合集
    importnetaddrfromnetaddrimport*importpandasaspdimportstreamlitasstfromconcurrent.futuresimportThreadPoolExecutorimportsubprocessimportshlexfromthreadingimportLockimportnetmikoclasscompute(object):def__init__(self):......
  • lua模块化编程
    moduleA.lua--moduleA.lualocalmoduleA={}functionmoduleA.hello()print("HellofrommoduleA")--与调用者同一个环境,可以调用到原环境中的sayHi函数sayHi()endreturnmoduleAmoduleB.lua--moduleB.lualocalmoduleB={}functionmoduleB.......
  • 计算机网络汇总
    一网络分层模型OSI七层模型 是国际标准化组织提出一个网络分层模型,其大体结构以及每一层提供的功能如下图所示:TCP/IP四层模型是目前被广泛采用的一种模型,我们可以将TCP/IP模型看作是OSI七层模型的精简版本,由以下4层组成:应用层传输层网络层网络接口层需要......
  • (续)signal-slot:python版本的多进程通信的信号与槽机制(编程模式)的库(library) —— 强化学
    前文:signal-slot:python版本的多进程通信的信号与槽机制(编程模式)的库(library)——强化学习ppo算法库sample-factory的多进程包装器,实现类似Qt的多进程编程模式(信号与槽机制)——python3.12版本下成功通过测试......
  • 多线程系列(十三) -一文带你搞懂阻塞队列
    一、摘要在之前的文章中,我们介绍了生产者和消费者模型的最基本实现思路,相信大家对它已经有一个初步的认识。在Java的并发包里面还有一个非常重要的接口:BlockingQueue。BlockingQueue是一个阻塞队列,更为准确的解释是:BlockingQueue是一个基于阻塞机制实现的线程安全的队列。通......
  • 深度学习-卷积神经网络-Faster RCNN anchor详解-53
    目录1.Anchor参考:https://zhuanlan.zhihu.com/p/86403390?utm_id=01.Anchor我第一次接触Anchor(中文叫做锚)的时候,比较懵逼的,什么是锚这个问题让思考了好久,这也是阻碍大家学习FasterRCNN最大的绊脚石索性我们就先把anchor理解为一个个按照固定比例(长宽、大小)预定义的框lib/ne......
  • 计算机网络概述
    1.互联网的2个特点:联通性、资源共享2.计算机网络:由若干节点和连接这些节点的链路组成3.互“连”网:有多个网络通过一些路由器相互连接起来,构成了个覆盖范围更大的计算机网络。4.互联网提供者:ISP互联网交换点:IXP5.计算机之间的通信:主机A的某个进程和主机B上的另一个进程进行通......