recv

socket加入循环和粘包问题

為{幸葍}努か 提交于 2019-11-30 06:27:01
socket socket加入通信循环 客户端 import socket soc = socket.socket() soc.connect(('127.0.0.1', 8080)) while True: inp = input('请输入要发送的信息>>>') soc.send(inp.encode('utf-8')) 服务端 import socket soc = socket.socket(socket.AF_INET,socket.SOCK_STREAM) soc.bind(('127.0.0.1', 8080)) soc.listen(5) conn, addr = soc.accept() while True: try: data = conn.recv(1024) print(data) except Exception: conn.close() break soc.close() socket加入连接循环 客户端 import socket soc = socket.socket() soc.connect(('127.0.0.1', 8080)) while True: inp = input('请输入要发送的消息>>>') soc.send(inp.encode('utf-8')) 服务端 import socket soc = socket.socket

Python Socket(未编辑)

╄→гoц情女王★ 提交于 2019-11-30 05:27:57
客户端 import socket 导入socket模块 client = socket.socket() 声明socket协议类型,同时生成socket连接对象 client.connect(('localhost', 6969)) 连接 client.send(b'Hello World!') 发送数据给服务器端,数据必须为bytes类型 data = client.recv(1024) 接收服务器端的返回数据,默认1024字节,即1kb print('recv:', data) client.close() 服务器端 import socket server = socket.socket() server.bind(('localhost', 6969)) #绑定要监听的端口 server.listen() #监听 conn, addr = server.accept() #等待电话打入,由链接标记(由谁打进来的)和地址(电话号码)组成 #conn就是客户端连过来而在服务器端为其生成的一个连接实例 data = conn.recv(1024) #接收数据,默认1024字节 print('recv:', data) conn.send(data.upper()) #将数据转成大写发送回去 server.close() 来源: https://www.cnblogs.com

Get the number of bytes available in socket by 'recv' with 'MSG_PEEK' in C++

好久不见. 提交于 2019-11-30 02:05:35
C++ has the following function to receive bytes from socket, it can check for number of bytes available with the MSG_PEEK flag. With MSG_PEEK , the returned value of 'recv' is the number of bytes available in socket: #include <sys/socket.h> ssize_t recv(int socket, void *buffer, size_t length, int flags); I need to get the number of bytes available in the socket without creating buffer (without allocating memory for buffer ). Is it possible and how? You're looking for is ioctl(fd,FIONREAD,&bytes_available) , and under windows ioctlsocket(socket,FIONREAD,&bytes_available) . Be warned though,

django数据库操作

久未见 提交于 2019-11-29 19:18:41
一:web框架基础简介 【1】web框架本质   (1)web本质也是C/S架构   (2)浏览器:客户端   (2)服务端:服务端 【2】web框架自定义 import socket server = socket.socket() server.bind(('127.0.0.1',8080)) server.listen(6) while True: conn ,addr = server.accept() # 字符串 recv_data = conn.recv(1024).decode('utf-8') print(recv_data) conn.send(b'hello world') conn.close() (1)客户端结果展示 (2)服务端结果展示 '''b'GET / HTTP/1.1\r\nHost: 127.0.0.1:8080\r\nConnection: keep-alive\r\nCache-Control: max-age=0\r\nUpgrade-Insecure-Requests: 1\r\nUser-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36\r

Python 使用模块模拟并发处理

妖精的绣舞 提交于 2019-11-29 19:16:38
目录 socketserver模块 通过模块实现并发 socketserver模块 我们可以通过socketserver模块来模拟并发的一个状态 接下来我们通过使用socketserver来编写程序模拟并发的一个过程 程序编写: 思路: 用户注册登录界面 选择功能 功能的选择 上传 下载 查看文件 删除文件 对TCP协议粘包的处理 了解粘包: 粘包就是当数据过大或者过小,导致一直存储在内存中。过小导致多次数据同时发送,过大导致数据无法接收完全。 粘包代码: 服务器 import socket #生成一个socket对象 soc=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #绑定地址跟端口号 soc.bind(('127.0.0.1',8001)) #监听(半连接池的大小),不是连接数 soc.listen(3) #等着客户端来连接,conn相当于连接通道,addr是客户端的地址 while True: print('等待客户端连接') conn,addr=soc.accept() #卡主,如果没有客户端连接,会一直卡在这,当有连接,才继续往下走 print('有个客户端连接上了',addr) while True: try: data=conn.recv(1024) print(data) data2=conn.recv

[C++] epoll server实例

扶醉桌前 提交于 2019-11-29 19:11:36
// IO多路复用,事件驱动+非阻塞,实现一个线程完成对多个fd的监控和响应,提升CPU利用率 // epoll优点: // 1.select需要每次调用select时拷贝fd,epoll_ctl拷贝一次,epoll_wait就不需要重复拷贝 // 2.不需要像select遍历fd做检查,就绪的会被加入就绪list,遍历list完成处理 // 3.没有最大连接限制,与最大文件数目相关:cat /proc/sys/fs/file-max,与内存相关 // epoll实现相关: // 1.epoll_ctl,将fd的event使用RB tree保存,读写O(logN); // 2.一旦有event,内核负责添加到rdlist链表 // 3.epoll_wait检查链表看是否有事件,并进行处理 // Ref // https://www.cnblogs.com/lojunren/p/3856290.html // http://blog.chinaunix.net/uid-28541347-id-4273856.html // Question: // 是否需要每个event一个实例? #include <cstdlib> /* exit() */ #include <cstdio> /* perror(): 打印信息+发生错误的原因,可用于定位。 */ #include

android QMI机制---底层消息发送

时光怂恿深爱的人放手 提交于 2019-11-29 17:50:13
5 底层消息发送 在linux_qmi_qmux_if_server.c文件的入口main()函数,通过一个select来监听所有从 linux_qmi_client端发出的socket,通过for循环调用linux_qmi_qmux_if_server_process_client_msg() 处理这些监听的消息。进入到函数linux_qmi_qmux_if_server_process_client_msg()后, 通过recv函数将监听的socket的消息写入buf_size这个buffer里面。调用流程图如下, if ((buf_size = recv (fd, (void*)&platform_msg_hdr, QMI_QMUX_IF_PLATFORM_SPECIFIC_HDR_SIZE,0))<= 0) recv方法在接收socket时,并没有全部接收。而且只接收了platform_msg_hdr。这个platform_msg_hdr 是在linux_qmi_qmux_client里面定义的,server接收到后,首先会判断从client端发过来的这个消息是否正常, 包括client_id和消息长度。 remaining_bytes = (size_t) platform_msg_hdr.total_msg_size - QMI_QMUX_IF_PLATFORM

同步IO、异步IO、阻塞IO、非阻塞IO之间的联系与区别

主宰稳场 提交于 2019-11-29 17:26:26
原文链接https://www.cnblogs.com/euphie/p/6376508.html POSIX 同步IO、异步IO、阻塞IO、非阻塞IO,这几个词常见于各种各样的与网络相关的文章之中,往往不同上下文中它们的意思是不一样的,以致于我在很长一段时间对此感到困惑,所以想写一篇文章整理一下。 POSIX(可移植操作系统接口)把同步IO操作定义为导致进程阻塞直到IO完成的操作,反之则是异步IO 按POSIX的描述似乎把同步和阻塞划等号,异步和非阻塞划等号,但是为什么有的人说同步IO不等于阻塞IO呢?先来说说几种常见的IO模型吧。 IO模型 这里统一使用Linux下的系统调用recv作为例子,它用于从套接字上接收一个消息,因为是一个系统调用,所以调用时会 从用户进程空间切换到内核空间运行一段时间再切换回来 。默认情况下recv会等到网络数据到达并且复制到用户进程空间或者发生错误时返回,而第4个参数flags可以让它马上返回。 阻塞IO模型 使用recv的默认参数一直等数据直到拷贝到用户空间,这段时间内进程始终阻塞。A同学用杯子装水,打开水龙头装满水然后离开。这一过程就可以看成是使用了阻塞IO模型,因为如果水龙头没有水,他也要等到有水并装满杯子才能离开去做别的事情。很显然,这种IO模型是同步的。 非阻塞IO模型 改变flags,让recv不管有没有获取到数据都返回

TCP recvfrom() doesn't store 'from'

戏子无情 提交于 2019-11-29 17:13:25
I'm making a server program using TCP and I want to get the IP adress of the sender of the message I just received. Here's my code: case FD_READ: { //Incoming data; get ready to receive char buffer[DEFAULT_BUFLEN]; int bytes_received; memset(buffer, '\0', sizeof(buffer)); struct sockaddr_in recvIn; int recv_length = sizeof(struct sockaddr); memset((void *)&recvIn, '\0', recv_length); bytes_received = recvfrom(wParam, buffer, DEFAULT_BUFLEN, 0, (struct sockaddr *)&recvIn, &recv_length); cout << inet_ntoa(recvIn.sin_addr) << "\n"; break; } So I'm using Windows messages to see if I should check

IO模型(epoll)--详解-01

主宰稳场 提交于 2019-11-29 15:35:32
写在前面   从事服务端开发,少不了要接触网络编程。epoll作为linux下高性能网络服务器的必备技术至关重要,nginx、redis、skynet和大部分游戏服务器都使用到这一多路复用技术。   本文会从网卡接收数据的流程讲起,串联起CPU中断、操作系统进程调度等知识;再一步步分析阻塞接收数据、select到epoll的进化过程;最后探究epoll的实现细节。目录: 一、从网卡接收数据说起 二、如何知道接收了数据? 三、进程阻塞为什么不占用cpu资源? 四、内核接收网络数据全过程 五、同时监视多个socket的简单方法 六、epoll的设计思路 七、epoll的原理和流程 八、epoll的实现细节 九、结论 一、从网卡接收数据说起   下图是一个典型的计算机结构图,计算机由CPU、存储器(内存)、网络接口等部件组成。了解epoll本质的第一步,要从硬件的角度看计算机怎样接收网络数据。    下图展示了网卡接收数据的过程。在①阶段,网卡收到网线传来的数据;经过②阶段的硬件电路的传输;最终将数据写入到内存中的某个地址上(③阶段)。这个过程涉及到DMA传输、IO通路选择等硬件有关的知识,但我们只需知道:网卡会把接收到的数据写入内存。 二、如何知道接收了数据?   了解epoll本质的第二步,要从CPU的角度来看数据接收。要理解这个问题,要先了解一个概念——中断。   计算机执行程序时