首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏虚拟技术学习

    多进程服务器

    二、步骤 1、建立连接 (1)socket函数 这里使用的是Ipv4,TCP套接字,所以使用的接口是:lfd = socket(AF_INET, SOCK_STREAM, 0)如果是IPV6把AF_INET 那就是把第二个改成SOCK_DGRAM; (2)setsockopt函数 主要是端口复用:固定写法就好,第一个参数是socket函数返回值套接字的文件描述符:int opt = 1; setsockopt(lfd , SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)); (3)bind函数 bind(lfd, (struct sockaddr*)&ser_addr, sizeof ; int lfd = tcp.Socket(AF_INET, SOCK_STREAM, 0); tcp.setSockOpt(lfd); tcp.setSerAddr(serv_addr , 1); tcp.Bind(lfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)); tcp.Listen(lfd, 128)

    6K20发布于 2021-09-14
  • 来自专栏虚拟技术学习

    多路IO转接服务器-select

    , &readSet)){ //cfd = do_accept(lfd, tcp_select); cfd = tcp.Accept(lfd, (struct )); tcp.Listen(lfd, 128); return lfd; } void initSelectSet(fd_set& aset, int lfd){ FD_ZERO (&aset); FD_SET(lfd, &aset); } int do_accept(int lfd, SelectTcp& tcp){ } void do_read(int cfd){ ; int lfd = initSocketConnect(tcp, serv_addr); //初始化阻塞监听前的信息;;; initSelectSet(allSet, lfd) , &readSet)){ //cfd = do_accept(lfd, tcp_select); cfd = tcp.Accept(lfd, (struct

    1.2K10发布于 2021-09-15
  • 来自专栏虚拟技术学习

    多线程服务器

    函数 socket(AF_INET, SOCK_STREAM, 0)socket函数是为了创建服务器端的套接字,是用来监听是否有客户端来连接的; (2)、setsockopt函数 setsockopt(lfd , SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)setsockopt是为了设置端口复用,opt设置为1; (3)、bind函数 bind(lfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)bind函数是为了将服务端的地址结构(IP+端口)绑定到套接字上; (4)、listen函数 listen(lfd, 128 需要分配主线程和子线程的工作: 主线程:将子线程分离出进程,使其不会影响后续的接收,子线程结束后,自行回收结束 子线程:使用读写的套接字与客户端进行通信 (1)、accept函数 cfd = accept(lfd ){ int opt = 1; int ret = setsockopt(lfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)

    83710发布于 2021-09-11
  • 来自专栏转载gongluck的CSDN博客

    第6章 I/O复用:select和poll函数

    /Gnet.h" int main(int argc, const char* argv[]) { int lfd, connfd; int maxfd; int client )); Listen(lfd, LISTENQ); maxfd = lfd; maxi = -1; for(int i=0; i<FD_SETSIZE; ++i) client[i] = -1; FD_ZERO(&allset); FD_SET(lfd, &allset); printf("waiting for connecting. , &rset)) { client_addr_len = sizeof(client_addr); connfd = Accept(lfd )); Listen(lfd, LISTENQ); client[0].fd = lfd; client[0].events = POLLRDNORM; for(int

    91140发布于 2018-03-09
  • 来自专栏莫浅子的学习笔记

    C++初级项目-webserver(1)

    ); return -1; } // 将监听文件描述符lfd添加到epoll树上 struct epoll_event ev; ev.data.fd = lfd; ev.events = EPOLLIN 上的事件 if (sockfd == lfd) { // 接受新的客户端连接 int cfd = Accept(lfd, NULL, NULL 处理连接请求和客户端数据 在主循环中,通过判断就绪事件的文件描述符,可以区分是监听文件描述符lfd上的连接请求还是客户端文件描述符上的数据到达事件。 // 处理监听文件描述符lfd上的事件 if (sockfd == lfd) { // 接受新的客户端连接 int cfd = Accept(lfd, NULL, NULL); -1; } //将监听文件描述符lfd上树 struct epoll_event ev; ev.data.fd = lfd; ev.events =

    84030编辑于 2023-11-19
  • 来自专栏莫浅子的学习笔记

    多路IO—POll函数,epoll服务器开发流程

    如果超过了时长也会立刻返回 函数返回值: >0: 发生变化的文件描述符的个数 =0: 没有文件描述符发生变化 -1: 表示异常 poll函数开发流程 1 创建socket ,得到监听文件描述符,lfd ); 2 设置端口复用----------setsockopt() 3 绑定 ------ bind() 4 struct pollfd client[1024];  client[0].fd = lfd (client[0].revents = POLLIN)     {           //接受新的客户端连接          k ++;           cfd  = Accept(lfd ; ev.events = EPOLLIN; epoll_ctl(epfd,EPOLL_CTL_ADD,lfd,&ev); //lfd 对应的事件节点上树 while(1) { nready ; ev.events = EPOLLIN; epoll_ctl(epfd,EPOLL_CTL_ADD,lfd,&ev); //lfd 对应的事件节点上树 while(1) { nready

    56840编辑于 2023-11-01
  • 来自专栏机器和智能

    端口复用(bind error: Address already in use 问题)

    #include <sys/socket.h> // server int main(int argc, const char* argv[]) { // 创建监听的套接字 int lfd = socket(AF_INET, SOCK_STREAM, 0); if(lfd == -1) { perror("socket error"); exit serv_addr.sin_addr.s_addr); // 设置端口复用 // 需要在bind函数之前设置 int opt = 1; setsockopt(lfd if(ret == -1) { perror("bind error"); exit(1); } // 监听 ret = listen(lfd { perror("send error"); exit(1); } } close(cfd); close(lfd

    1.3K10编辑于 2024-09-17
  • 来自专栏小工匠聊架构

    高性能网络编程 - select、 poll 、epoll 、libevent

    include <string.h> #include <arpa/inet.h> #include <sys/select.h> int main() { // 1.创建套接字 int lfd = socket(AF_INET, SOCK_STREAM, 0); if(lfd == -1) { perror("socket"); exit(0) 监听 ret = listen(lfd, 100); if(ret == -1) { perror("listen"); exit(0); -> 读缓冲区, 委托内核去处理 // 数据初始化, 创建自定义的文件描述符集 fd_set rdset, tmp; FD_ZERO(&rdset); FD_SET(lfd , &rdset); int maxfd = lfd; while(1) { // 委托内核检测 tmp = rdset; ret

    93281编辑于 2023-11-09
  • 来自专栏转载gongluck的CSDN博客

    第8章 基本UDP套接字编程

    = Socket(AF_INET, SOCK_STREAM, 0); setsockopt(lfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));// 端口复用 Bind(lfd, (const struct sockaddr*)&server_addr, sizeof(server_addr)); Listen(lfd, LISTENQ \n"); maxfd = lfd > udpfd ? lfd : udpfd; FD_ZERO(&rset); while(1) { FD_SET(lfd, &rset); FD_SET(udpfd, , &rset)) { client_addr_len = sizeof(client_addr); connfd = Accept(lfd

    973110发布于 2018-03-09
  • 来自专栏机器和智能

    IO多路转接技术 | select详解

    client连接server的时候会进行三次握手,发送FIN数据包到server的监听文件描述符lfd对应的读缓冲区中。 所以,要想知道有没有client发出连接请求,就要把lfd放到读集合中,让内核去检测。也就是说,有没有连接请求也是委托内核去检测。 , (struct sockaddr*)&serv_addr, serv_len); // 设置同时监听的最大个数 listen(lfd, 36); printf("Start accept ,lfd对应位为1,说明有新的连接请求 if(FD_ISSET(lfd, &temp)) { // 接受新连接,返回一个用于通信的cfd,并加入到原始的读集合reads(备份) // // i为啥是从lfd+1开始的? // 因为lfd是第一个创建的文件描述符,而文件描述符创建的规则是当前最小空闲,所以lfd+1应该就是第一个用于通信的文件描述符cfd。

    28700编辑于 2025-05-13
  • 来自专栏Linux内核及编程语言底层相关技术研究

    对又一个epoll问题的全面分析

    , opt, err; struct sockaddr_in addr; lfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); assert(lfd = -1); opt = 1; err = setsockopt(lfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)); assert(! err); err = listen(lfd, 8); assert(! = -1); lfd = tcp_listen(); epoll_ctl_add(epfd, lfd, EPOLLIN); for (;;) { n = epoll_wait(epfd = lfd) { handle_events(&events[i], epfd); continue; } cfd = accept(lfd,

    1.2K30发布于 2019-08-05
  • 来自专栏数据挖掘

    python3安装sklearn机器学习库

    安装sklearn需要的库请全部在万能仓库下载: http://www.lfd.uci.edu/~gohlke/pythonlibs/#scipy http://www.lfd.uci.edu/~gohlke /pythonlibs/#numpy http://www.lfd.uci.edu/~gohlke/pythonlibs/#matplotlib http://www.lfd.uci.edu/~gohlke

    2.9K40发布于 2019-07-02
  • 来自专栏Linux内核及编程语言底层相关技术研究

    epoll和shutdown使用不当可能导致死循环

    , opt, err; struct sockaddr_in addr; lfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); assert(lfd = -1); opt = 1; err = setsockopt(lfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)); assert(! err); err = listen(lfd, 8); assert(! = -1); lfd = tcp_listen(); epoll_ctl_add(epfd, lfd, EPOLLIN); for (;;) { n = epoll_wait(epfd lfd, NULL, NULL); assert(cfd !

    2K20发布于 2019-08-02
  • 来自专栏Linux内核及编程语言底层相关技术研究

    read方法返回0后还会有epollin事件吗

    , opt, err; struct sockaddr_in addr; lfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); assert(lfd = -1); opt = 1; err = setsockopt(lfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)); assert(! err); err = listen(lfd, 8); assert(! = -1); lfd = tcp_listen(); epoll_ctl_add(epfd, lfd, EPOLLIN); for (;;) { n = epoll_wait(epfd = lfd) { handle_events(&events[i], epfd); continue; } cfd = accept(lfd,

    2.8K20发布于 2019-08-06
  • 来自专栏Linux内核及编程语言底层相关技术研究

    socket的SO_REUSEADDR参数全面分析

    ); assert(lfd ! = -1); opt = 1; err = setsockopt(lfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)); assert(! ); assert(lfd ! = -1); opt = 1; err = setsockopt(lfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)); assert(! err); return lfd; } int main(int argc, char *argv[]) { int lfd, cfd; lfd = tcp_listen("127.0.0.1

    3.2K21发布于 2019-08-09
  • 来自专栏编程

    Selenium+python自动化84-python3.6用PyUserInput

    报错:No matching distribution found for pyHook (from PyUserInput) 四、pyHook安装 1.pyHook下载地址:[https://www.lfd.uci.edu /~gohlke/pythonlibs/#lxml](https://www.lfd.uci.edu/~gohlke/pythonlibs/#lxml) 2.下载到本地后,用pip安装 > pip install No matching distribution found for pywin32 (from PyUserInput) 五、pywin32 1.pywin32下载地址:[https://www.lfd.uci.edu /~gohlke/pythonlibs/#lxml](https://www.lfd.uci.edu/~gohlke/pythonlibs/#lxml) 2.下载到本地后,安装 > pip install

    1.1K70发布于 2018-02-28
  • 来自专栏陶士涵的菜地

    [PHP] 通用网关接口CGI 的运行原理

    str_join(char *str1, char *str2); char *html_response(char *res, char *buf); int main(void) { int lfd socklen_t clin_len; char buf[1024], web_result[1024]; int len; FILE *cin; if ((lfd , sizeof(serv_addr)) == -1) { perror("bind error"); exit(1); } if (listen(lfd SIGCLD, SIG_IGN); while (1) { clin_len = sizeof(clin_addr); if ((cfd = accept(lfd } else { perror("fork error"); exit(1); } } close(lfd

    90950发布于 2019-09-10
  • 来自专栏机器和智能

    socket IPC(本地套接字domain)

    TCP来实现本地套接字 下面介绍通过TCP来实现本地套接字的过程 - 服务器端 创建套接字 int lfd = socket(AF_LOCAL, SOCK_STREAM, 0); 绑定 - struct cfd = accept(ldf, &client, &len); - - 通信 - send - recv - - 断开连接 - close(cfd); - close(lfd , cfd, n, i; uid_t cuid; char buf[1024]; lfd = serv_listen("foo.socket"); if (lfd < 0) { switch (lfd) { case -3:perror("listen"); break; case -2:perror("bind"); break; case -1:perror("socket"); break; } exit(-1); } cfd = serv_accept(lfd, &cuid); if (cfd < 0)

    62911编辑于 2024-08-08
  • 来自专栏从零开始学自动化测试

    Selenium+python自动化84-python3.6用PyUserInput

    No matching distribution found for pyHook (from PyUserInput) 四、pyHook安装 1.pyHook下载地址:[https://www.lfd.uci.edu /~gohlke/pythonlibs/#lxml](https://www.lfd.uci.edu/~gohlke/pythonlibs/#lxml) ? 五、pywin32 1.pywin32下载地址:[https://www.lfd.uci.edu/~gohlke/pythonlibs/#lxml](https://www.lfd.uci.edu/~

    1.5K50发布于 2018-04-08
  • 来自专栏高性能服务器开发

    C/C++ 服务器并发

    创建监听的套接字     int lfd = socket(AF_INET, SOCK_STREAM, 0);     // 2.  // 这个宏可以代表任意一个IP地址     addr.sin_addr.s_addr = INADDR_ANY;  // 这个宏的值为0 == 0.0.0.0     int ret = bind(lfd 设置监听     ret = listen(lfd, 128);     // 4.  阻塞等待并接受客户端连接     struct sockaddr_in cliaddr;     int clilen = sizeof(cliaddr);     int cfd = accept(lfd 创建监听的套接字     int lfd = socket(AF_INET, SOCK_STREAM, 0);     if(lfd == -1)     {         perror("socket

    1.2K30编辑于 2022-03-04
领券