recv

The behavior of send() and recv() in socket communication

核能气质少年 提交于 2019-12-09 19:04:55
问题 The following is the setup: Server Client | | accept connect | | v | send msg1-> | | | v v recv <- send | | v v send msg2-> recv | | v v close Here is my question: 1. Client actually receives msg1 before it closes, why is it like this? 2. send msg2 returns normally. Since client closes after receiving msg1, why is send msg2 successful? P.S. I'm using stream socket for TCP. 回答1: The recv function will get whatever is next in the receive buffer. In the case of the client, if the socket is a

TCP之深入浅出send和recv

坚强是说给别人听的谎言 提交于 2019-12-09 12:26:55
在这篇文章中,我用深入浅出socket选项行为中的4个选项来介绍send和recv的行为 SO_RCVBUF SO_SNDBUF 先明确一个概念:每个TCP socket在内核中都有一个发送缓冲区和一个接收缓冲区,TCP的全双工的工作模式以及TCP的滑动窗口便是依赖于这两个独立的buffer以及此buffer的填充状态。接收缓冲区把数据缓存入内核,应用进程一直没有调用read进行读取的话,此数据会一直缓存在相应socket的接收缓冲区内。再啰嗦一点,不管进程是否读取socket,对端发来的数据都会经由内核接收并且缓存到socket的内核接收缓冲区之中。read所做的工作,就是把内核缓冲区中的数据拷贝到应用层用户的buffer里面,仅此而已。进程调用send发送的数据的时候,最简单情况(也是一般情况),将数据拷贝进入socket的内核发送缓冲区之中,然后send便会在上层返回。换句话说,send返回之时,数据不一定会发送到对端去(和write写文件有点类似),send仅仅是把应用层buffer的数据拷贝进socket的内核发送buffer中。后续我会专门用一篇文章介绍read和send所关联的内核动作。每个UDP socket都有一个接收缓冲区,没有发送缓冲区,从概念上来说就是只要有数据就发,不管对方是否可以正确接收,所以不缓冲,不需要发送缓冲区。

JAVA网络编程:TCP之深入浅出send和recv ,发送和接收缓冲区

时光总嘲笑我的痴心妄想 提交于 2019-12-09 11:58:53
本篇我们用一个测试机上的阻塞socket实例来说明主题。文章中所有图都是在测试系统上现截取的。 需要理解的3个概念 1. TCP socket的buffer 每个TCP socket在内核中都有一个发送缓冲区和一个接收缓冲区,TCP的全双工的工作模式以及TCP的流量(拥塞)控制便是依赖于这两个独立的buffer以及buffer的填充状态。接收缓冲区把数据缓存入内核,应用进程一直没有调用recv()进行读取的话,此数据会一直缓存在相应socket的接收缓冲区内。再啰嗦一点,不管进程是否调用recv()读取socket,对端发来的数据都会经由内核接收并且缓存到socket的内核接收缓冲区之中。recv()所做的工作,就是把内核缓冲区中的数据拷贝到应用层用户的buffer里面,并返回,仅此而已。进程调用send()发送的数据的时候,最简单情况(也是一般情况),将数据拷贝进入socket的内核发送缓冲区之中,然后send便会在上层返回。换句话说,send()返回之时,数据不一定会发送到对端去(和write写文件有点类似),send()仅仅是把应用层buffer的数据拷贝进socket的内核发送buffer中,发送是TCP的事情,和send其实没有太大关系。接收缓冲区被TCP用来缓存网络上来的数据,一直保存到应用进程读走为止。对于TCP,如果应用进程一直没有读取,接收缓冲区满了之后

Python之HTTP静态Web服务器开发

為{幸葍}努か 提交于 2019-12-08 22:29:47
1 # 1.导入模块 2 import socket 3 4 5 def main(): 6 # 2.创建socket对象 7 server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 8 9 # 3.设置端口复用 10 server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True) 11 # 4.绑定端口 12 server_socket.bind(('', 8001)) 13 # 5.设置监听 14 server_socket.listen(128) 15 # 设置循环接收客户端连接,实现多客户端连接 16 while True: 17 # 6.接收客户端连接 18 client_socket, ip_port = server_socket.accept() 19 print("客户端:%s 上线了,使用端口为:%s" % ip_port) 20 # 7.接收数据 21 recv_data = client_socket.recv(1024).decode('utf-8') 22 if recv_data: 23 # print('接收的数据为:', recv_data) 24 # 获取http请求报文中的指定路径 25 #

Whats the addrlen field in recvfrom() used for?

拟墨画扇 提交于 2019-12-08 02:17:15
问题 I'm using recvfrom in my program to get DGRAM data from a server I specify in src_addr. However, I'm not sure why I need to initialize and pass in addrlen. I read the man page and I didn't really understand what it's getting at. If src_addr is not NULL, and the underlying protocol provides the source address, this source address is filled in. When src_addr is NULL, nothing is filled in; in this case, addrlen is not used, and should also be NULL. The argument addrlen is a value-result argument

How to detect that the client is still connected (and not hung-up) using recv()?

廉价感情. 提交于 2019-12-07 17:13:52
问题 I have written a multiclient Server program in C on SuSE Linux Enterprise Server 12.3 (x86_64) , I am using one thread per client to receive data. My problem is: I am using one terminal to run the server, and using several other terminals to telnet to my server (as client). I have used recv() in the server to receive data from client, I have also applied checks for return value of recv() i.e. Error on -1 ; Conn. Closed on 0 & Normal operation else. I have not used any flags in recv() . My

C++实现简单的网络聊天程序

那年仲夏 提交于 2019-12-07 15:40:30
1、什么是socket,socket在哪? Socket是应用层与 TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中, Socket其实就是一个门面模式,它把复杂的 TCP/IP协议族隐藏在 Socket接口后面,对用户来说,一组简单的接口就是全部,让 Socket去组织数据,以符合指定的协议。socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用“打开open –> 读写write/read –> 关闭close”模式来操作,Socket就是该模式的一个实现,socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO、打开、关闭),这些函数我们在后面进行介绍。 有三种不同形式的套接字:流式套接字(SOCK_STREAM),数据包套接字(SOCK_DGRAM),原始套接字(SOCK_RAW)。 基于TCP的Socket使用流式套接字,相比于使用数据包套接字的UDP来讲,TCP可以使程序员不必关心数据正确性及顺序正确性,缺点是效率较低。 基于TCP的Socket编程最常见的应用场景是在C/S架构下的分布式应用,针对客户端和服务器端提供不同的Socket系统调用。 2、client/server(CS)模式 服务端:服务器端: 初始化 socket套接字------>绑定socket------

网络编程 UDP协议 TCP局域网客户端与服务端上传下载电影示例

人盡茶涼 提交于 2019-12-06 20:32:31
UDP协议 (了解) 称之为数据包协议。 特点:   1) 不需要建立链接。   2) 不需要知道对方是否收到。   3) 数据不安全   4) 传输速度快   5)能支持并发   6) 不会粘包   7) 无需先启动服务端再启动客户端 优点:   - 传输速度快   - 能支持并发   - 不会粘包 缺点:   - 数据不安全, 容易丢失 应用场景: 早期的QQ聊天室。 # server端 import socket # socket.SOCK_DGRAM ---> UPD协议 server = socket.socket(type=socket.SOCK_DGRAM) # 服务端需要绑定一个地址,让别人知道你在哪里 server.bind( ('127.0.0.1', 9002) ) while True: # 发送数据给服务端的用户地址 data, addr = server.recvfrom(1024) print(addr) print(data) # msg = input('Server ---> Client:').encode('utf-8') # 无论服务端还是客户端,发送消息时,都必须知道对方是谁 # server.sendto(msg, addr) # client端 import socket client = socket.socket(type

socket通信

天大地大妈咪最大 提交于 2019-12-06 15:10:01
目录 socket通信 socket套接字 黏包现象 socket通信 socket套接字 什么是socket socket是一个模块,又称为套接字,用来封装 互联网协议(应用层一下的所有层) 为什么要有socket socket可以实现 互联网协议应用层以下层的工作 提高开发效率 server服务端 import socket server = socket.socket() server.bind(('127.0.0.1', 9527)) # 把地址绑定到套接字 server.listen(5) # 监听连接,半连接池,控制访问量 print('server is running...') conn, addr = server.accept() # 接收客户端连接 data = conn.recv(1024) # 接收客户端信息 print(data) # 打印客户端信息 conn.send(b'hello I am server...') # 向客户端发送信息 conn.close() # 关闭客户端套接字 server.close() # 关闭服务器套接字(可选) client客户端 import socket client = socket.socket() # 创建客户端套接字 client.connect(('127.0.0.1', 9527))# 尝试连接服务器

python-套接字编程

£可爱£侵袭症+ 提交于 2019-12-06 14:12:16
服务端和客户端。 服务端脚本: # Auther:AlphaPanda # Description:server # Version:1 # Date:Mon Dec 2 09:02:01 EST 2019 # 服务端 import socket # 1 创建一个socket对象,默认按照tcp协议创建 sk = socket.socket() # 2 绑定Ip和端口,在网络上注册该主机,让其他电脑找到这台服务器 sk.bind( ("127.0.0.1",9000) ) # 3 开启监听 sk.listen() # 4 三次握手 conn,addr = sk.accept() print(conn,addr) # 5 收发数据的逻辑 msg = conn.recv(1024) # 一次性,最多接收1024个字节 print(msg.decode("utf-8")) conn.send("diyicifasong".encode("utf-8")) # 6 四次挥手 conn.close() # 7 退还端口 sk.close() 客户端脚本: #!/usr/bin/python3 # coding:utf-8 # Auther:AlphaPanda # Description:socket tcp client # Version:1 # Date:Mon Dec 2 09:09