socket函数

网路通信之socket

≡放荡痞女 提交于 2020-04-07 04:50:46
网络通信的三要素: 1. IP: 设备的标识 2. 端口号: 进程间共同的标识 3. 传输协议: UDP协议: 面向无连接,数据被封装(在64k以内),不可靠(速度快)。 运用实例: 聊天 TCP协议 : 面向连接,建立双方数据通道,需要三次握手,可靠(速度慢)。运用实例: 打电话 简单的说:UDP以包形式发送数据,但是不可靠,可能会丢包。TCP以流形式发送数据,可靠,但是效率慢 Socket通信实际上就是网络通信,在通信双方两头都有socket,以包/流形式发送数据。 *简单聊天程序:该案例是PC端和服务器进行通信 *发和收同时进行,需要用多线程线,一个线程控制发,一个线程控制收 public class book16{ public static void main(String[] args) throws SocketException { DatagramSocket sendsocket=new DatagramSocket(); DatagramSocket receivesocket=new DatagramSocket(1001); //根据端口来接受 new Thread(new send(sendsocket)).start(); new Thread(new receive(receivesocket)).start(); } } class send

ACE的Socket

橙三吉。 提交于 2020-04-06 17:16:49
转自:http://www.rosoo.net/a/cpp/2010/0127/8416.html 使用ACE进行Socket编程,需要使用到下面几个类: ACE_SOCK_Connector :连接器,主动建立连接,用于Socket Client; ACE_SOCK_Acceptor :接受器,被动建立连接,用于Socket Server; ACE_SOCK_Stream :传输数据的流,用于传输数据; ACE_INET_Addr :用于表示通信端点的地址; ace/INET_Addr.h文件中定义了一些有用的ACE_INET_Addr构造函数,用于创建通信端点的地址;一旦构造好一个通信端点的ACE_INET_Addr信息,那么,就可以使用这个地址去连接服务器了;ACE中使用ACE_SOCK_Stream类的对象来表示已经连接成功的TCP Socket;之所以这样命名,是因为TCP连接代表的是面向连接的虚连接,或者是"字节流"; 短写问题 :当你试图把一些字节写往远程主机时,由于网络缓冲区溢出、拥塞,或其它任何原因,导致你的字节没有被全部送出去,那么随后,你必须移动你的数据指针,发送剩余的数据;你必须持续地做这样的发送操作,直到把原来所有的自己全部都发送出去为;止.这样的问题在网络编程中发生的非常频繁,ACE的send_n()方法调用封装了这些操作

setsockopt :SO_LINGER 选项设置

依然范特西╮ 提交于 2020-04-03 07:12:10
setsockopt 设置 SO_LINGER 选项 此选项指定函数close对面向连接的协议如何操作(如TCP)。内核缺省close操作是立即返回,如果有数据残留在套接口缓冲区中则系统将试着将这些数据发送给对方。 SO_LINGER选项用来改变此缺省设置。使用如下结构: struct linger { int l_onoff; /* 0 = off, nozero = on */ int l_linger; /* linger time */ }; 有下列三种情况: 1、设置 l_onoff为0,则该选项关闭,l_linger的值被忽略,等于内核缺省情况,close调用会立即返回给调用者,如果可能将会传输任何未发送的数据; 2、设置 l_onoff为非0,l_linger为0,则套接口关闭时TCP夭折连接,TCP将丢弃保留在套接口发送缓冲区中的任何数据并发送一个RST给对方,而不是通常的四分组终止序列,这避免了TIME_WAIT状态; 3、设置 l_onoff 为非0,l_linger为非0,当套接口关闭时内核将拖延一段时间(由l_linger决定)。如果套接口缓冲区中仍残留数据,进程将处于睡眠状态,直 到(a)所有数据发送完且被对方确认,之后进行正常的终止序列(描述字访问计数为0)或(b)延迟时间到。此种情况下,应用程序检查close的返回值是非常重要的

nginx 源码学习笔记(十八)—— ngx_add_inherited_sockets 继承的sockets

依然范特西╮ 提交于 2020-04-01 20:25:43
之前几节有讲过多进程的创建过程和子进程所处理的事情,今天要讲一下nginx里面main函数的另一个主要的操作ngx_add_inherited_sockets。 ngx_add_inherited_sockets:服务器监听套接字的封装。 本文的主要灵感来自: http://blog.csdn.net/livelylittlefish/article/details/7277607 ,感谢作者分享。 在ngx_add_inherited_sockets方法内,有一个重要的结构体需要讲解——ngx_listening_s src/core/ngx_connection.h typedef struct ngx_listening_s ngx_listening_t; struct ngx_listening_s { ngx_socket_t fd; //文件描述符 struct sockaddr *sockaddr; //socket地址 socklen_t socklen; //地址长度 size_t addr_text_max_len; ngx_str_t addr_text; //最终存放socket地址,之前的sockaddr主要存放没转换前的数据,之后会讲解 int type; int backlog; int rcvbuf; //接受缓冲区大小 int sndbuf; /

Websocket协议之php实现

◇◆丶佛笑我妖孽 提交于 2020-03-27 21:57:18
前面学习了HTML5中websocket的握手协议、打开和关闭连接等基础内容,最近用php实现了与浏览器websocket的双向通信。在学习概念的时候觉得看懂了的内容,真正在实践过程中还是会遇到各种问题,网上也有一些关于php的websocket的实现,但是只有自己亲手写过之后才知道其中的感受。其中,google有一个开源的phpwebsocket类( https://code.google.com/p/phpwebsocket/ ),但是从其握手过程中可以明显看出,这还是最初的websocket协议,请求头中使用了两个KEY,并非version 13(现行版本)。下面是本人实践过程,同时封装好了一个现行版本的php实现的实用的websocket类。 一、握手 1、客户端发送请求 websocket协议提供给javascript的API就是特别简洁易用。 View Code 先看效果,客户端和服务器端握手的结果如下: 2、服务器端 封装的类为WebSocket,address和port为类的属性。 (1)建立socket并监听 1 function createSocket() 2 { 3 $this->master=socket_create(AF_INET, SOCK_STREAM, SOL_TCP) 4 or die("socket_create() failed:"

Python 08--网络编程 Socket编程

旧街凉风 提交于 2020-03-25 03:48:43
本节内容: Socket语法及相关 SocketServer实现多并发  Socket语法及相关 socket概念 socket本质上就是在2台网络互通的电脑之间,架设一个通道,两台电脑通过这个通道来实现数据的互相传递。 我们知道网络 通信 都 是基于 ip+port 方能定位到目标的具体机器上的具体服务,操作系统有0-65535个端口,每个端口都可以独立对外提供服务,如果 把一个公司比做一台电脑 ,那公司的总机号码就相当于ip地址, 每个员工的分机号就相当于端口, 你想找公司某个人,必须 先打电话到总机,然后再转分机 。 建立一个socket必须至少有2端, 一个服务端,一个客户端, 服务端被动等待并接收请求,客户端主动发起请求, 连接建立之后,双方可以互发数据。 A network socket is an endpoint of a connection across a computer network . Today, most communication between computers is based on the Internet Protocol ; therefore most network sockets are Internet sockets . More precisely, a socket is a handle (abstract

关于socket 的学习

こ雲淡風輕ζ 提交于 2020-03-22 03:47:37
在前一篇讲到了服务侦听,具体构建了一个抽象类,该类是后续服务类中SOCKET通讯服务的基类,而SOCKET通讯中不论是服务端还是客户端都需要数据收发,客户端对应服务端侦听的部份则是连接,下面就讲讲连接和数据收发 1.连接 该部份比较简单,只有三个简单的函数:CreateConnectToRemoteSocket,ConnectToRemoteCore,AsyncConnectToRemoteCore, CreateConnectToRemoteSocket:创建连接的Socket,其中CheckSockectIsConnected是检查是否已连接(该函数用了MS使用的例子来判断是否已连接),最后使用传进的参数(如果不为null)设置SOCKET(比如超时等等),TcpIPSocketSetting类是一个专用户设置SOCKET的类 ConnectToRemoteCore:同步连接到远程 AsyncConnectToRemoteCore:异步连接到远程,在该函数中用到类接口ITranseParamets,使用SocketAsyncEventArgs.UserToken存储该接口参数,对于该接口的定义我会在代码中贴出,并且属性及方法也会在该接口中说明,其实现会在后续章节中讲到,SocketAsyncEventArgs.RemoteEndPoint存储要连接到的远程终结点(这个一定要设)

socket可读可写就绪条件

蹲街弑〆低调 提交于 2020-03-21 04:57:00
参考 《UNIX 网络编程卷1》中的《第6章 I/O复用》 一、 满足下列四个条件中的任何一个时,一个套接字准备好读。 该套接字接收缓冲区中的数据字节数大于等于套接字接收缓存区低水位。 对于TCP和UDP套接字而言,缓冲区低水位的值默认为1。那就意味着,默认情况下,只要缓冲区中有数据,那就是可读的。我们可以通过使用SO_RCVLOWAT套接字选项(参见setsockopt函数)来设置该套接字的低水位大小。此种描述符就绪(可读)的情况下,当我们使用read/recv等对该套接字执行读操作的时候,套接字不会阻塞,而是成功返回一个大于0的值(即可读数据的大小)。 该连接的读半部关闭(也就是接收了FIN的TCP连接)。对这样的套接字的读操作,将不会阻塞,而是返回0(也就是EOF)。 该套接字是一个listen的监听套接字,并且目前已经完成的连接数不为0。对这样的套接字进行accept操作通常不会阻塞。 有一个错误套接字待处理。对这样的套接字的读操作将不阻塞并返回-1(也就是返回了一个错误),同时把errno设置成确切的错误条件。这些待处理错误(pending error)也可以通过指定SO_ERROR套接字选项调用getsockopt获取并清除。 二、满足下列四个条件中的任何一个时,一个套接字准备好写。 该套接字发送缓冲区中的可用空间字节数大于等于套接字发送缓存区低水位标记时

重叠I/O之事件通知

杀马特。学长 韩版系。学妹 提交于 2020-03-19 02:51:49
在 Winsock 中,重叠 I/O(Overlapped I/O)模型能达到更佳的系统性能,高于select模型、异步选择和事件选择三种。重叠模型的基本设计原理便是让应用程序使 用一个重叠的数据结构(WSAOVERLAPPED),一次投递一个或多个 Winsock I/O 请求。针对这些提交的请求,在它们完成之后,我们的应用程序会收到通知,于是 我们就可以对数据进行处理了。 要想在一个套接字上使用重叠 I/O 模型,首先必须使用 WSA_FLAG_OVERLAPPED 这个标志,创建一个套接字。例如: SOCKET s = WSASocket(AF_INET, SOCK_STREAM, 0, NULL, 0, WSA_FLAG_OVERLAPPED); 注:创建套接字的时候,假如使用的是 socket 函数,那么会默认设置 WSA_FLAG_OVERLAPPED 标志。 成功建好一个套接字,同时将其与一个本地接口绑定到一起后,便可开始进行重叠 I/O 操作,为了要使用重叠结构,我们常用的 send、recv 等收发数据的函数也都要 被 WSASend、WSARecv 替换掉了,方法是调用下述的 Winsock 函数,同时指定一个 WSAOVERLAPPED 结构(可选): WSASend() WSASendTo() WSARecv() WSARecvFrom() WSAIoctl

Select模型原理

不羁的心 提交于 2020-03-19 02:48:19
Select模型原理 利用select函数,判断套接字上是否存在数据,或者能否向一个套接字写入数据。目的是防止应用程序在套接字处于锁定模式时,调用recv(或send)从没有数据的套接字上接收数据,被迫进入阻塞状态。 select参数和返回值意义如下: int select ( IN int nfds, //0,无意义 IN OUT fd_set* readfds, //检查可读性 IN OUT fd_set* writefds, //检查可写性 IN OUT f d_set* exceptfds, //例外数据 IN const struct timeval* timeout); //函数的返回时间 struct timeval { long tv_sec; //秒 long tv_usec; //毫秒 }; select返回fd_set中可用的套接字个数。 fd_set是一个SOCKET队列,以下宏可以对该队列进行操作: FD_CLR( s, *set) 从队列set删除句柄s; FD_ISSET( s, *set) 检查句柄s是否存在与队列set中; FD_SET( s, *set )把句柄s添加到队列set中; FD_ZERO( *set ) 把set队列初始化成空队列. Select工作流程 1:用FD_ZERO宏来初始化我们感兴趣的fd_set。