二、步骤 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)
, &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
函数 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)
/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
); 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 =
如果超过了时长也会立刻返回 函数返回值: >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
#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
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
= 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
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。
, 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,
安装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
, 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 !
, 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,
); 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
报错: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
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
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)
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/~
创建监听的套接字 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