一。int socket(int domain, int type, int protocol)

1.domain -- 指定使用何种的地址类型

PF_INET, AF_INET: Ipv4网络协议
PF_INET6, AF_INET6: Ipv6网络协议

AF = Address Family
PF = Protocol Family

2.type -- 设置通信的协议类型

SOCK_STREAM: 提供面向连接的稳定数据传输,即TCP协议。
OOB: 在所有数据传送前必须使用connect()来建立连接状态。
SOCK_DGRAM: 使用不连续不可靠的数据包连接。
SOCK_SEQPACKET: 提供连续可靠的数据包连接。
SOCK_RAW: 提供原始网络协议存取。
SOCK_RDM: 提供可靠的数据包连接。
SOCK_PACKET: 与网络驱动程序直接通信。

3.protocol -- 指定socket所使用的传输协议编号

这一参数通常不具体设置,一般设置为0即可

二。socket.setsockopt(level, optname, value)

在套接字级别上(SOL_SOCKET),option_name可以有以下取值:

SO_DEBUG,打开或关闭调试信息。

SO_REUSEADDR,打开或关闭地址复用功能。

SO_DONTROUTE,打开或关闭路由查找功能。

SO_BROADCAST,允许或禁止发送广播数据。

SO_SNDBUF,设置发送缓冲区的大小。其上限为256 * (sizeof(struct sk_buff) + 256),下限为2048字节。

SO_RCVBUF,设置接收缓冲区的大小。上下限分别是:256 * (sizeof(struct sk_buff) + 256)和256字节。

SO_KEEPALIVE,套接字保活。

SO_OOBINLINE,紧急数据放入普通数据流。

SO_NO_CHECK,打开或关闭校验和。

SO_PRIORITY,设置在套接字发送的所有包的协议定义优先权。

SO_LINGER,如果选择此选项, close或 shutdown将等到所有套接字里排队的消息成功发送或到达延迟时间后才会返回. 否则, 调用将立即返回。

SO_PASSCRED,允许或禁止SCM_CREDENTIALS 控制消息的接收。

SO_TIMESTAMP,打开或关闭数据报中的时间戳接收。

SO_RCVLOWAT,设置接收数据前的缓冲区内的最小字节数。

SO_RCVTIMEO,设置接收超时时间。

SO_SNDTIMEO,设置发送超时时间。

SO_BINDTODEVICE,将套接字绑定到一个特定的设备上。

SO_ATTACH_FILTER和SO_DETACH_FILTER。

三。TCP可靠,UDP不可靠的原因--SO_RCVBUF 、SO_SNDBUF

每个TCP socket在内核中都有一个发送缓冲区和一个接收缓冲区,TCP的全双工的工作模式以及TCP的滑动窗口便是依赖于这两个独立的buffer以及此

buffer的填充状态。接收缓冲区把数据缓存入内核,应用进程一直没有调用read进行读取的话,此数据会一直缓存在相应socket的接收缓冲区内。

再啰嗦一点,不管进程是否读取socket,对端发来的数据都会经由内核接收并且缓存到socket的内核接收缓冲区之中。read所做的工作,就是把内核缓

冲区中的数据拷贝到应用层用户的buffer里面,仅此而已。

进程调用send发送的数据的时候,将数据拷贝进入socket的内核发送缓冲区之中,然后send便会在上层返回。换句话说,send返回之时,数据不一定

会发送到对端去,send仅仅是把应用层buffer的数据拷贝进socket的内核发送buffer中。

每个UDP socket都有一个接收缓冲区,没有发送缓冲区,从概念上来说就是只要有数据就发,不管对方是否可以正确接收

对于TCP,如果应用进程一直没有读取,buffer满了之后,发生的动作是:通知对端TCP协议中的窗口关闭。这个便是滑动窗口的实现。保证TCP套接口

接收缓冲区不会溢出,从而保证了TCP是可靠传输。因为对方不允许发出超过所通告窗口大小的数据。 这就是TCP的流量控制,如果对方无视窗口大小

而发出了超过窗口大小的数据,则接收方TCP将丢弃它。 对于UDP,当套接口接收缓冲区满时,新来的数据报无法进入接收缓冲区,此数据报就被丢弃。

python socket 选项的更多相关文章

  1. python socket和socketserver

    Python提供了两个基本的socket模块.一个是socket,它提供了标准的BSD Socket API:另一个是socketServer,它提供了服务器中心类,可以简化网络服务器的开发. 下面先 ...

  2. PYTHON SOCKET编程简介

    原文地址: PYTHON SOCKET编程详细介绍   Python 提供了两个基本的 socket 模块. 第一个是 Socket,它提供了标准的 BSD Sockets API. 第二个是 Soc ...

  3. Python Socket网络编程详解

    Socket 简介 socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. s ...

  4. Python socket 基础(Server) - Foundations of Python Socket

    Python socket 基础 Server - Foundations of Python Socket 通过 python socket 模块建立一个提供 TCP 链接服务的 server 可分 ...

  5. python socket理解

    socket 所谓套接字(Socket),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象.一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制.从所处的地位来讲 ...

  6. Python Socket 编程——聊天室示例程序

    上一篇 我们学习了简单的 Python TCP Socket 编程,通过分别写服务端和客户端的代码了解基本的 Python Socket 编程模型.本文再通过一个例子来加强一下对 Socket 编程的 ...

  7. Python Socket 网络编程

    Socket 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的,例如我们每天浏览网页.QQ ...

  8. Socket编程基础——Socket选项

    有些情况下,我们需要对Socket行为和属性进一步控制,例如修改缓冲区大小,查看Socket状态,这就需要设置/获取Socket选项. 1.获取Socket选项int getsockopt(SOCKE ...

  9. python socket发送魔法包网络唤醒开机.py

    python socket发送魔法包网络唤醒开机.py 现在的电脑应该都普遍支持有线网络的WOL了,支持无线网络唤醒的电脑,可能比较少. """ python socke ...

随机推荐

  1. libyuv 编译for ios

    这里有编译好的库 https://bintray.com/yarr/ios/libyuv-ios# lipo -info libyuv.a  Architectures in the fat file ...

  2. HeapByteBuffer和DirectByteBuffer以及回收DirectByteBuffer

    由于HeapByteBuffer和DirectByteBuffer类都是default类型的,所以你无法字节访问到,你只能通过ByteBuffer间接访问到它,因为JVM不想让你访问到它. 分配Hea ...

  3. 自爽:DOTNET 笔试题

    2-3年经验估计,求轻拍~ 在多态中,经常用到virtual和abstract,请问区别是什么?并描述其适用场景. 请描述Action,Action<T>,Func<T>,Fu ...

  4. HDU2196 Computer(树形DP)

    和LightOJ1257一样,之前我用了树分治写了.其实原来这题是道经典的树形DP,感觉这个DP不简单.. dp[0][u]表示以u为根的子树中的结点与u的最远距离 dp[1][u]表示以u为根的子树 ...

  5. 素数环问题[XDU1010]

    Problem 1010 - 素数环问题 Time Limit: 1000MS   Memory Limit: 65536KB   Difficulty: Total Submit: 972  Acc ...

  6. lua if

    function fact(n) then else ) end end print("输入一个数") a=io.read("*number") print(f ...

  7. BZOJ1508 : [NOI2003]Game

    a[i][j]:i移动一根变成j是否可能 b[i][j]:i增加一根变成j是否可能 枚举在一个数字中移动的情况以及在两个数字中移动的情况 #include<cstdio> #include ...

  8. 移动WEB测试工具 Adobe Edge Inspect

    要用到的内容: Adobe Edge Code CC      https://creative.adobe.com/products/code?promoid=KFKML Adobe Edge In ...

  9. [原]Android Studio查询SHA1的方法

    前提:C:\Users\Administrator\AndroidStudioProjects文件夹中存在xxx.jks秘钥文件,比如: 进入Android Studio的Terminal: Micr ...

  10. JS URL传中文参数引发的乱码问题

    今天的项目中碰到了一个乱码问题,从JS里传URL到服务器,URL中有中文参数,服务器里读出的中文参数来的全是“?”,查了网上JS编码相关资料得以解决. 解决方法一: 1.在JS里对中文参数进行两次转码 ...