recv

同一端口监听tcp和udp请求

放肆的年华 提交于 2019-11-27 19:06:05
问题: 众所周知,同一台机器的同一个端口只可以被一个进程使用,一般用于tcp,或者udp。那一个进程使用同一个端口同时监听tcp、udp请求,是否可以呢?答案:可以。 代码: server 为了同时监听,server使用select进行多路访问控制。 server端代码如下: /* TCP INET use select */ #include<stdio.h> #include<stdlib.h> #include<string.h> #include<errno.h> #include<sys/types.h> #include<sys/socket.h> #include<netinet/in.h> #define LENGTH_OF_LISTEN_QUEUE 20 #define SERVER_PORT 8888 #define MAXLINE 4096 #define MAX_FD_NUM 10 static int init_new_client( int client_fd); static int remove_client( int client_fd); static int get_max_fd( int fd); static int client_fdset[MAX_FD_NUM]; int main( int argc, char ** argv) {

网络编程 总结

我是研究僧i 提交于 2019-11-27 15:44:55
目录 1.C/S B/S架构 2.网络通信原理 3.osi七层协议 4.UDP TCP 协议 5.TCP协议的三次握手和四次挥手 6.socket套接字 7.基于TCP协议的socket简单通信 8.基于TCP协议的socket循环通信 9.基于TCP协议的socket 链接+循环 通信 10.基于TCP协议的socket应用实例: 执行远程命令 11.粘包现象 12.low版解决粘包现象 13.recv工作原理 14.高大上版解决粘包方式(自定制包头) 15.基于UDP协议的socket通信 16.socketserver(待讲) 1.C/S B/S架构 C/S B/S架构 C: client端 B: browse 浏览器 S: server端 C/S架构: 基于客户端与服务端之间的通信 ​ QQ, 游戏,皮皮虾, 快手,抖音. ​ 优点: 个性化设置,响应速度快, ​ 缺点: 开发成本,维护成本高,占用空间,用户固定. B/S架构: 基于浏览器与服务端之间的通信 ​ 谷歌浏览器,360浏览器,火狐浏览器等等. ​ 优点: 开发维护成本低,占用空间相对低,用户不固定. ​ 缺点: 功能单一,没有个性化设置,响应速度相对慢一些. 2.网络通信原理 80年代,固定电话联系,(还没有推广普通话) 1. 两台电话之间一堆物理连接介质连接. 2. 拨号,锁定对方电话的位置.

缓冲区 粘包

两盒软妹~` 提交于 2019-11-27 13:45:50
缓冲区 ​ 每个 socket 被创建后, 都会分配两个缓冲区, 输入缓冲区和输出缓冲区 ​ write( )/send( ) 并不立即向网络中传输数据, 而是先将数据写入缓冲区中, 再由TCP协议将数据从缓冲区发送到目标机器. 一旦将数据写入到缓冲区, 函数就可以成功返回, 不管他们有没有到达目标机器, 也不管它们何时被发送到网络, 这些都是TCP协议负责的事情. ​ TCP协议独立于 write( )/send( ) 函数, 数据有可能刚被写入缓冲区就发送到网络, 也可能在缓冲区中不断积压, 多次写入的数据被一次性发送到网络, 这取决于当时的网络情况, 当前线程是否空闲等诸多因素, 不由程序员控制. ​ read( )/recv( ) 函数也是如此, 也从输入缓冲区中读取数据, 而不是直接从网络中读取. I/O 缓冲区特性 I/O 缓冲区在每个TCP套接字中单独存在 I/O 缓冲区在创建套接字时自动生成 即使关闭套接字也会继续传送输出缓冲区中遗留的数据 关闭套接字将丢失输入缓冲区中的数据 ​ 输入输出缓冲区的默认大小一般都是 8K , 可以通过getsockopt( )函数获取 缓冲区的作用 ​ 暂时存储一些数据. ​ 缓冲区存在, 如果你的网络波动, 保证数据的收发稳定, 匀速 ​ 缺点: 造成了粘包现象之一 粘包 发生粘包的两种情况 接收方没有及时接收缓冲区的包,

socket 聊天程序实例

≡放荡痞女 提交于 2019-11-27 13:33:10
socket单线程的阻塞 单线程,即数据的串行发送,会导致阻塞,如果要解决这个问题,当然在Server端就需要支持多线程,即数据折并发。 # 本机实现的单线程非交互式的socket程序 # #### server ########################################################################################### import socket #导入socket类 HOST ='' #定义侦听本地地址口(多个IP地址情况下),这里表示侦听所有,也可以写成0.0.0.0 PORT = 50007 #Server端开放的服务端口 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #选择Socket类型和Socket数据包类型 s.bind((HOST, PORT)) #绑定IP地址和端口 s.listen(1) #定义侦听数开始侦听(实际上并没有效果) conn, addr = s.accept() #定义实例,accept()函数的返回值可以看上面的socket函数说明 print 'Connected by', addr while 1: data = conn.recv(1024) #接受套接字的数据 if not data:break

Python之Socket自动重连

南笙酒味 提交于 2019-11-27 13:32:30
参考:https://www.cnblogs.com/MikeZhang/p/pythonTcpReconnect20170701.html 问题描述 现有一个tcp客户端程序,需定期从服务器取数据,但由于种种原因(网络不稳定等)需要自动重连。 测试服务器示例代码: https://github.com/mike-zhang/pyExamples/blob/master/socketRelate/tcpServer1_multithread.py 解决方案: ''' tcp client with reconnect E-Mail : Mike_Zhang@live.com ''' #! /usr/bin/env python #-*- coding:utf-8 -*- import os,sys,time import socket def doConnect(host,port): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) try : sock.connect((host,port)) except : pass return sock def main(): host,port = "127.0.0.1",12345 print host,port sockLocal = doConnect(host

第八章.网络编程

梦想与她 提交于 2019-11-27 12:09:53
第八章 网络编程 两个运行中的程序如何传递信息? 通过文件 两台机器上的两个运行程序如何通信? 通过网络 8.1 网络应用开发架构 8.1.1C/S结构 全称 client / server 客户端 / 服务端 [C/S架构是第一种比较早的软件架构,主要用于局域网内。也叫 客户机/服务器模式。C/S架构软件有一个特点,就是如果用户要使用的话, 需要下载一个客户端,安装后就可以使用 。比如QQ,OFFICE软件等。 [ 它可以分为 客户机和服务器两层 : 第一层: 在客户机系统上结合了界面显示与业务逻辑(即用户表示层) 第二层: 通过网络结合了数据库服务器(数据库层)。   这里需要补充的是,客户端不仅仅是一些简单的操作,它也是会处理一些运算,业务逻辑的处理等。也就是说,客户端也做着一些本该由服务器来做的一些事情. C/S架构的优点: 1 C/S架构的界面和操作可以很丰富。(客户端操作界面可以随意排列,满足客户的需要) 2 安全性能可以很容易保证。(因为只有两层的传输,而不是中间有很多层。 3 由于只有一层交互,因此响应速度较快。(直接相连,中间没有什么阻隔或岔路,比如QQ,每天那么多人在线,也不觉得慢) C/S架构的缺点: 可以将QQ作为类比: 1 适用面窄,通常用于局域网中。 2 用户群固定。由于程序需要安装才可使用,因此不适合面向一些不可知的用户。 3 维护成本高,发生一次升级

什么是粘包,如何解决?

可紊 提交于 2019-11-27 11:08:26
小的知识点 s1 = 'q' s2 = b'q' print(type(s1),type(s2)) print(s1.encode('utf-8')) #<class 'str'> <class 'bytes'> # b'q' bytes 类型: ASCII 字符,在字符前面 b " " 非 ASCII 类型,比如中文,先转化为字符串,然后再转为 bytes 类型 s1 = "太白jx" print(len(s1)) # 4 b1 = s1.encode('utf=8') # bytes 类型 print(b1) # b'\xe5\xa4\xaa\xe7\x99\xbdjx' print(len(b1)) # 8 一 : socket 看socket之前,先来回顾一下五层通讯流程: 但实际上从传输层开始以及以下,都是操作系统帮咱们完成的,下面的各种包头封装的过程,用咱们去一个一个做么? NO!   Socket又称为套接字,它是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。当我们使用不同的协议进行通信时就得使用不同的接口,还得处理不同协议的各种细节,这就增加了开发的难度

Python 第三十章 粘包现象

亡梦爱人 提交于 2019-11-27 11:00:28
什么是粘包? 有缓存区,缓存区里放响应的字节,满了后,将剩下的存起来 等下次再接受信息的时候,先将上次剩下的输出 再次接受信息的时候,将上次没有输出的信息输出 在TCP协议中,发送方发送的若干包数据到接收方,接收时粘成一包 从接收缓冲区看,后一包数据的头紧接着前一包数据的尾。 为什么设置缓冲区? 断网后数据会丢失 下载数据断网后再联网做个缓冲控制速度均衡 1、暂时存储一些数据 2、网络有波动,保证数据的收发稳定和均速 确定:造成了粘包现象之一 什么情况下出现粘包 1、send:数据过大,大过对方recv的上限时,对方第二次recv时,会接收上一次没有recv完的剩余数据 2、send:连续短暂的send多次(传送数据量较小),统一存到了recv缓存区;再统一发送出去 多少算小 展示一些收发的内容 只要send就要转成bytes类型 如何解决粘包现象 服务端发一次数据:10000字节 客户端接受数据时,循环接收,每次最多接收1024个字节,直到将10000所有的字节全部接收完毕, 将接收的数据拼接在一起,最后解码 1、遇到的问题:recv的次数无法确定 发送总具体数据之前,先给一个总数据的长度,然后再发总数据 客户端先接收一个长度,再循环recv控制循环的条件就是只要接收的数据小于总长度,就一直循环 2、遇到的问题: 总数据的长度转成字节

Python之路【第十五篇】开发FTP多线程程序

我只是一个虾纸丫 提交于 2019-11-27 08:52:40
要求: 1.用户加密认证 2.允许同时多用户登录 3.每个用户有自己的家目录,且只能访问自己的家目录 4.对用户进行磁盘配额,每个用户的可用空间不同 5.允许用户在ftp server上随意切换目录 6.允许用户查看当前目录下的文件 7.允许上传和下载文件,并保证文件的一致性md5 8.文件传输过程中显示进度条 9.支持文件的断点续传 使用:1.启动ftp_server.py2.创建用户,输入:用户名(默认密码是zhurui)3.启动FTP服务器4.启动客户端ftp_client.py5.输入用户名和密码:alex zhurui | william zhurui6.与服务器server交互: server服务端 bin下的文件 ftp_server.py #_*_ coding:utf-8 _*_ #Author :simon import os import sys BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) sys.path.append(BASE_DIR) from core.main import Manager if __name__ == '__main__': Manager().run() conf下的文件 accounts.ini(这个可以在执行中创建)

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

坚强是说给别人听的谎言 提交于 2019-11-27 08:27:41
问题 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