recv

Linux深入理解Socket异常

本秂侑毒 提交于 2020-02-04 23:49:44
在各种网络异常情况的背后,TCP是怎么处理的?又是怎样把处理结果反馈给上层应用的?本文就来讨论这个问题。分为两个场景来讨论 建立连接时的异常情况 1 正常情况下   经过三次握手,客户端连接成功,服务端有一个新连接到来。 2 客户端连接了服务端未监听的端口   在这种情况下,服务端会对收到的SYN回应一个RST(RFC 793 3.4),客户端收到RST之后,终止连接,并进入CLOSED状态。 客户端的connect返回ECONNREFUSED 111 /* Connection refused */。 3 客户端与服务器之间的网络不通,这又分两种情况   connect返回主机不可达。具体信息在不同系统上不一样,比如linux上的定义是EHOSTUNREACH 113 /* No route to host */。明显给出了一个不可访问的地址(例如,访问一个不存在的本地网络地址,或者DNS解析失败会导致这种情况。 connect返回连接超时。这种情况下,客户端发送的SYN丢失在网络中,没有得到确认,客户端的TCP会超时重发SYN。以ubuntu 12.04为例,重发SYN的时间,系列是:0,1,3,7,15,31,63(2n-1-1)。即发送7个SYN后等待一个超时时间(例如:127秒),如果在这段时间内仍然没有收到ACK,则connect返回超时。   在这两种情况下,

解决粘包-简单版本

喜你入骨 提交于 2020-02-03 17:29:32
服务端:import socketimport subprocessimport struct#简易版缺点:struct 的数据i需要在4以内,如果发送的数据较大,会超过I,无法发送。因此需要优化#创建套接字server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)server.bind(('192.168.43.177',8093))server.listen(5)while True: conn,addr = server.accept() while True: try: cmd = conn.recv(8086) if not cmd :break obj = subprocess.Popen(cmd.decode('utf-8'),shell = True, stdout = subprocess.PIPE, stderr = subprocess.PIPE) stdout = obj.stdout.read() stderr = obj.stderr.read() #3.把命令的结果返回给客户端 #第一步:制作固定长度的报头 total_size = len(stdout)+len(stderr) header = struct.pack('i',total_size) print(stdout) conn

STM32驱动SDIO WIFI 介绍(十六) ---- 上位机UDP操作/代码

最后都变了- 提交于 2020-01-29 06:59:04
代码工程的GITHUB连接: 点进进入GITHUB仓库 https://github.com/sj15712795029/stm32f1_marvell88w8801_marvell8801_wifi Marvell自己实现驱动系列文章分为几篇介绍: SDIO wifi Marvell8801/Marvell88w8801 介绍(一) ---- 芯片介绍 SDIO wifi Marvell8801/Marvell88w8801 介绍(二) ---- SDIO协议介绍 SDIO wifi Marvell8801/Marvell88w8801 介绍(三) ---- 寄存器介绍 SDIO wifi Marvell8801/Marvell88w8801 介绍(四) ---- 命令/事件/数据格式 SDIO wifi Marvell8801/Marvell88w8801 介绍(五) ---- TLV SDIO wifi Marvell8801/Marvell88w8801 介绍(六) ---- 实现初始化功能 SDIO wifi Marvell8801/Marvell88w8801 介绍(七) ---- 实现搜索功能 SDIO wifi Marvell8801/Marvell88w8801 介绍(八) ---- 实现STA功能 SDIO wifi Marvell8801

2018-2019-1 20165307 20165327 20165332 实验五 通讯协议设计

谁说胖子不能爱 提交于 2020-01-29 01:46:54
2018-2019-1 20165307 20165327 20165332 实验五 通讯协议设计 Linux下OpenSSL的安装与使用 1.两人一组 2.基于Socket实现TCP通信,一人实现服务器,一人实现客户端 3.研究OpenSSL算法,测试对称算法中的AES,非对称算法中的RSA,Hash算法中的MD5 4.选用合适的算法,基于混合密码系统实现对TCP通信进行机密性、完整性保护。 实验步骤 在OpenSSL下载地址下载OpenSSL 解压OpenSSL源代码 tar xzvf openssl-1.1.0j.tar.gz 进入源代码目录后 $ ./config $ make $ make test $ make install 编写测试代码 test_openssl.c #include <stdio.h> #include <openssl/evp.h> int main(){ OpenSSL_add_all_algorithms(); return 0; } 编译和执行 结果打印0则表示安装成功 实现TCP通信 server.c: #include<stdlib.h> #include<pthread.h> #include<sys/socket.h> #include<sys/types.h> //pthread_t , pthread_attr_t and so

电子邮件客户端程序设计与实现 python实现 计算机网络课程设计

南笙酒味 提交于 2020-01-28 12:18:53
实验内容 使用网络相关原理,设计一个电子邮件客户端程序。 代码 入口主类 import tkinter as tk import threading from Test_5_Mail . recvMail import recv_email_by_imap4 from Test_5_Mail . sendMail import mailSocket class Application ( tk . Frame ) : def __init__ ( self , root ) : tk . Frame . __init__ ( self , root ) self . grid ( ) self . createWdiget ( ) def createWdiget ( self ) : tk . Label ( self , text = '收件人邮箱:' ) . grid ( row = 0 , column = 1 , sticky = tk . E ) self . RecvMail = tk . StringVar ( ) tk . Entry ( self , textvariable = self . RecvMail ) . grid ( row = 0 , column = 2 , sticky = tk . W ) tk . Label ( self , text

Python - converting sock.recv to string

我的梦境 提交于 2020-01-27 07:49:07
问题 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? 回答1: 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

Python - converting sock.recv to string

元气小坏坏 提交于 2020-01-27 07:47:16
问题 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? 回答1: 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

Python - converting sock.recv to string

我与影子孤独终老i 提交于 2020-01-27 07:43:51
问题 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? 回答1: 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

粘包分包现象及处理

落爺英雄遲暮 提交于 2020-01-22 20:21:27
现象描述 由于TCP协议本身的机制 客户端与服务器会维持一个连接发送数据 粘包原因 如果发送的网络数据包太小,TCP则会合并较小的数据包再发送, 接收端便无法区分哪些数据是发送端自己分开的, 因此便会产生粘包现象。 或者,接收端把数据放到接收缓冲区中, 如果数据没有及时从缓冲区取走, 下次取数据时就可能出现一次取走多个数据包的情况。 如: 客户端Send:hello 客户端Send:unity 服务端Recv:Recv 分包原因 如果发送的数据包太大,TCP有可能会将它拆分成多个包发送 接收端的一次Receive可能只收到一部分数据。 如: 客户端Send:hellounity 服务端Recv:hel 服务端Recv:lounity 处理办法 每个数据包前加上长度字节 如果缓冲区的数据长度大于要提取的字节数 则取出相应的字节 否则等待下一次数据接收 代码实现 private void ProcessData(Conn conn) { //小于字节长度 if (conn.buffCount < sezeof(Int32)) return; //消息长度 Array.Copy(conn.readBuff,conn.lenBytes,sizeof(Int32)); conn.msgLength = BitConverter.ToInt32(conn.lenBytes,0); if

python3 socket 超时设置

情到浓时终转凉″ 提交于 2020-01-22 02:41:47
针对链接(connect)时候的超时: # 法一: import socket socket.setdefaulttimeout(5) sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect((host, port)) sock.sendall('xxx') sock.recv(1024) sock.close() ''' 20160716 update socket.setdefaulttimeout(5) 此句必须放到建立链接的前面,否则超时设置无效果 ''' # 法二: import socket sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.settimeout(5) sock.connect((host, port)) # 恢复默认超时设置,设置某些情况下socket进入阻塞模式(如makefile) sock.settimeout(None) sock.connect((host, port)) sock.sendall('xxx') sock.recv(1024) sock.close() 针对接收(recv)数据时的超时: # 法一: import socket socket