recv

什么是粘包现象

不问归期 提交于 2019-11-28 14:41:50
简单远程执行命令程序开发(30分钟) 是时候用户socket干点正事呀,我们来写一个远程执行命令的程序,写一个socket client端在windows端发送指令,一个socket server在Linux端执行命令并返回结果给客户端 执行命令的话,肯定是用我们学过的subprocess模块啦,但 注意注意注意: res = subprocess.Popen(cmd.decode('utf-8'),shell=True,stderr=subprocess.PIPE,stdout=subprocess.PIPE) 命令结果的编码是以当前所在的系统为准的,如果是windows,那么 res.stdout.read()读出的就是GBK编码的 ,在接收端需 要用GBK解码,且只能从管道里读一次结果 ssh server import socket import subprocess ip_port = ('127.0.0.1', 8080) tcp_socket_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) tcp_socket_server.bind(ip_port) tcp_socket_server.listen(5) while True: conn, addr = tcp_socket_server

Receiving data from Java-Client (data contains int, short, string)

对着背影说爱祢 提交于 2019-11-28 14:25:16
I was searching for hours to get an answer about my question, but didnt find anything. Maybe I get some help here. What I'm trying to do: A Java-Client sends a message to a C-Server. The message contains different types like integer, short and also a string (e.g. message = int: total_msg_length; short: operation; string: hello --> total_msg-length=4 (size of integer), operation = 2 (size of short), hello = 5 (each letter is 1 byte=5). So, how can I receive the message in my server? The code below receives an Integer (works fine). Next step will be to receive a short and then a string

web服务器

六月ゝ 毕业季﹏ 提交于 2019-11-28 13:01:56
单进程服务器 from socket import * serSocket = socket(AF_INET,SOCK_STREAM) #重复使用绑定的信息 serSocket.setsockopt(sol_socket,so_reuseaddr,1) #四次挥手,服务器先结束,而且想立即运行服务器,还能绑定 localAddr = ("",7788) serSocket.bind(localAddr) serSocket.listen(5) while True: print("-----主进程,等待新客户端的到来-----") newSocket,destAddr = serSocket.accept() print("-----主进程,接下来负责数据处理") try: while True: recvData = newSocket.recv(1024) if len(recvData)>0: print('recv[%s]:%s'%(str(destAddr),recvData)) else: print('[%s]客户端已经关闭'%str(destAddr)) break finally: newSocket.close() serSocket.close() 多进程服务器: from socket import * from multiprocessing import

TCP recvfrom() doesn't store 'from'

拈花ヽ惹草 提交于 2019-11-28 11:36:58
问题 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 <

Python - converting sock.recv to string

假如想象 提交于 2019-11-28 10:01:54
I'm digging around with python and networking. while True: data = sock.recv(10240) This is definitely listening. But it seems to need to be converted to a text string. I've seen some people using struct.unpack() , but I'm not sure exactly how it works. What's the way to convert? What you get back from recv is a bytes string: Receive data from the socket. The return value is a bytes object representing the data received. In Python 3.x, to convert a bytes string into a Unicode text str string, you have to know what character set the string is encoded with, so you can call decode . For example,

小白对异步IO的理解

大兔子大兔子 提交于 2019-11-28 08:59:52
前言 看到越来越多的大佬都在使用python的异步IO,协程等概念来实现高效的IO处理过程,可是我对这些概念还不太懂,就学习了一下。 因为是初学者,在理解上有很多不到位的地方,如果有错误,还希望能够有人积极帮我指出。 下面就使用一个简单的爬虫的例子,通过一步一步的改进,最后来用异步IO的方式实现。 1. 阻塞的IO 我们要实现一个爬虫,去爬百度首页n次,最简单的想法就是依次下载,从建立socket连接到发送网络请求再到读取响应数据,顺序进行。 代码如下: 1 import time 2 import socket 3 import sys 4 5 def doRequest(): 6 sock = socket.socket() 7 sock.connect(('www.baidu.com',80)) 8 sock.send("GET / HTTP/1.1\r\nHost: www.baidu.com\r\nConnection: Close\r\n\r\n".encode("utf-8")) 9 response = sock.recv(1024) 10 return response 11 12 def main(): 13 start = time.time() 14 for i in range(int(sys.argv[1])): 15 doRequest() 16

解决粘包现象

非 Y 不嫁゛ 提交于 2019-11-28 08:12:09
目录 1. recv 工作原理 2.升级版解决粘包问题 3. 基于UDP协议的socket通信 1. recv 工作原理 1.能够接收来自socket缓冲区的字节数据; 2.当缓冲区没有数据可以读取时,recv会一直处于阻塞状态,知道缓冲区至少有一个字节数据可取,或者客户端关闭; 3.关闭远程端并读取所有数据后,再recv会返回字符串。 2.升级版解决粘包问题 应用层自定义协议FTP(文件传输协议). low版: 只能是有限的数据,将总数据长度固定成4个字节作为报头,再recv。当文件数据特别大时,会报错。 升级版优点: 1. 自定制报头。 如:dic = {'filename':xxx, 'md5':f454d5asfa5, 'total_size':1024*1024*1024} 2. 解决文件数据过大问题。 把报头做成字典,字典里包含将要发送的真实数据的描述信息(大小啊之类的),然后json序列化,然后用struck将序列化后的数据长度打包成4个字节。 我们在网络上传输的所有数据 都叫做数据包,数据包里的所有数据都叫做报文,报文里面不止有你的数据,还有ip地址、mac地址、端口号等等,其实所有的报文都有报头,这个报头是协议规定的。 思路: 服务端: 1. 自定义报头,字典形式,里面存放文件信息等; 2. 然后将报头字典 ——> json类型字符串 ——> 编码成

OVS源码connmgr_run分析

旧城冷巷雨未停 提交于 2019-11-28 07:28:19
connmgr即connect manager连接管理器,主要完成OVS网桥的连接管理。每一个网桥ofproto都有一个connmgr实体来管理连接。connmgr主要完成两种连接管理,一种是主动连接(即与控制器连接,作为客户端),一种是被动连接(主要提供ofctl等工具连接请求服务和snoop服务,作为服务端)。connmgr结构体中,all_conns是主动连接,services和snoops等提供被动连接服务。与connmgr_run流程相关的结构体如下图: 一个connmgr对应多个ofconn(如一个网桥连接多个控制器,则需要建立相应多个ofconn实例;和ofctl等工具连接时也要建立ofconn实例);一个ofconn对应一个rconn;一个rconn对应多个vconn(因为和控制器建立连接外,可能还会实现snoop功能,即监测并复制交互的of消息,则一个rconn会对应一个vconn和一个vconn结构体类型的数组monitor。 connmgr_run主要包含in_band_run, ofconn_run,以及一些与被动连接相关的流程。 connmgr_run(struct connmgr *mgr, void (*handle_openflow)(struct ofconn *, const struct ofpbuf *ofp_msg)) OVS

基于select的sokct ftp 服务端

生来就可爱ヽ(ⅴ<●) 提交于 2019-11-28 06:15:01
由于时间问题,没有实现并发上传下载的功能。后面再完善。 import select,socket,queue,json,os,threading,time,gevent,hashlib from gevent import monkey monkey.patch_all() class MyselectTCP(object): ''' 用select 实现的socket 服务端,没能实现并发 ''' socket_familly = socket.AF_INET socket_type = socket.SOCK_STREAM socket_request_numb = 1000 inputs = [] outputs = [] readerable, writeable, exceptinal = None,None,None msg_dict ={} BASEADDR = os.path.abspath("..\log\home") def __init__(self,ip,port): ''' 实例化一个socket服务端 :param ip: :param port: ''' self.sever = socket.socket(self.socket_familly,self.socket_type) self.sever.bind((ip,port)) self

select,poll,epoll最简单的解释

删除回忆录丶 提交于 2019-11-28 05:29:44
从事服务端开发,少不了要接触网络编程。epoll 作为 Linux 下高性能网络服务器的必备技术至关重要,nginx、Redis、Skynet 和大部分游戏服务器都使用到这一多路复用技术。 epoll 很重要,但是 epoll 与 select 的区别是什么呢?epoll 高效的原因是什么? 网上虽然也有不少讲解 epoll 的文章,但要么是过于浅显,或者陷入源码解析,很少能有通俗易懂的。笔者于是决定编写此文,让缺乏专业背景知识的读者也能够明白 epoll 的原理。 文章核心思想是:要让读者清晰明白 epoll 为什么性能好。 本文会从网卡接收数据的流程讲起,串联起 CPU 中断、操作系统进程调度等知识;再一步步分析阻塞接收数据、select 到 epoll 的进化过程;最后探究 epoll 的实现细节。 一、从网卡接收数据说起 下边是一个典型的计算机结构图,计算机由 CPU、存储器(内存)与网络接口等部件组成,了解 epoll 本质的第一步,要从硬件的角度看计算机怎样接收网络数据。 计算机结构图(图片来源:Linux内核完全注释之微型计算机组成结构) 下图展示了网卡接收数据的过程。 在 ① 阶段,网卡收到网线传来的数据; 经过 ② 阶段的硬件电路的传输; 最终 ③ 阶段将数据写入到内存中的某个地址上。 这个过程涉及到 DMA 传输、IO 通路选择等硬件有关的知识,但我们只需知道