socket

linux c socket选项:SO_ERROR

心不动则不痛 提交于 2020-02-24 04:11:47
获取套接字选项参数getsockopt原型: #include <sys/socket.h> int getsockopt(int sockfd, int level, int option, void *optval, socklen_t optlen); 当一个socket发生错误的时候,将使用一个名为so_error的变量记录对应的错误代码,这又叫做pending error,so_error为0时表示没有错误发生。一般来说,有2种方式通知进程有socket错误发生: 1、进程阻塞在select中,有错误发生时,select将返回,并将发生错误的socket标记为可读写; 2、如果进程使用信号驱动的I/O,将会有一个SIGIO产生并发往对应进程; 此时,进程可以通过SO_ERROR取得具体的错误代码。getsockopt返回后,*optval指向的区域将存储错误代码,而so_error被设置为0。 当so_error不为0时,如果进程对socket进行read操作,若此时接收缓存中没有数据可读,则read返回-1,且errno设置为so_error,so_error置为0,否则将返回缓存中的数据而不是返回错误;如果进行write操作,将返回-1,errno置为so_error,so_error清0。 注意,这是一个只可以获取,不可以设置的选项。 来源: CSDN 作者:

关于高负载服务器Kernel的TCP参数优化

删除回忆录丶 提交于 2020-02-24 02:03:22
net.ipv4.tcp_mem 内核分配给TCP连接的内存,单位是Page,1 Page = 4096 Bytes,可用命令查看: #getconf PAGESIZE 4096 net.ipv4.tcp_mem = 196608 262144 393216 第一个数字表示,当 tcp 使用的 page 少于 196608 时,kernel 不对其进行任何的干预 第二个数字表示,当 tcp 使用了超过 262144 的 pages 时,kernel 会进入 “memory pressure” 压力模式 第三个数字表示,当 tcp 使用的 pages 超过 393216 时(相当于1.6GB内存),就会报:Out of socket memory 以上数值适用于4GB内存机器,对于8GB内存机器,建议用以下参数: net.ipv4.tcp_mem = 524288 699050 1048576 (TCP连接最多约使用4GB内存) net.ipv4.tcp_rmem 和 net.ipv4.tcp_wmem 为每个TCP连接分配的读、写缓冲区内存大小,单位是Byte net.ipv4.tcp_rmem = 4096 8192 4194304 net.ipv4.tcp_wmem = 4096 8192 4194304 第一个数字表示,为TCP连接分配的最小内存 第二个数字表示

MYSQL5上运行多个实例

 ̄綄美尐妖づ 提交于 2020-02-24 01:56:02
date 20131005 参考 http://chenzehe.iteye.com/blog/1266260 官方文档 http://dev.mysql.com/doc/refman/5.1/zh/database-administration.html#multiple-servers 5.12. 在同一台机器上运行多个MySQL服务器 http://dev.mysql.com/doc/refman/5.1/zh/database-administration.html#mysqld-multi 5.1.5. mysqld_multi:管理多个MySQL服务器的程序 注意:mysqld_multi 是perl写的脚本 需要安装perl mysqld_multi 配置MySQL多实例 工作中吸取的 关闭时候 需要密码 一、配置说明 1、至少下面选项对每个服务器必须不同的 --port=port_num -port控制着TCP/IP连接的端口号 --socket=path --socket控制Unix中的Unix套接字文件路径和在Windows中的命名管道名称。 --pid-file=path 该选项只在Unix中使用。它指出服务器在其中写入进程ID的文件名。 如果你使用下面的日志文件选项,对于每个服务器来说,它们必须是不同的: 如果你使用下面的日志文件选项,对于每个服务器来说

Socket 函数

梦想的初衷 提交于 2020-02-24 01:38:15
Socket 小结 函数 注意 accept connect send recv socket() # include <sys/types.h> # include <sys/socket.h> int socket ( int family , int type , int protocal ) ; int family //参数指定所要使用的通信协议 AF_UNIX // Unix 内部协议 AF_INET // Internet 协议 AF_Ns //Xerox NS 协议 AF_IMPLINK //IMP 连接层 int type //指定套接字的类型 SOCK_STREAM //流套字 SOCK_DGRAM //数据报套字 SOCK_RAW //未加工套接字 SOCK_SEQPACKET //顺序包套接字 int protocal //参数常设置为 0 //socket()系统调用返回一个整数值,叫做套接字描述字 sockfd //失败 返回-1 bind() # include <sys/types.h> # include <sys/socket.h> int bind ( int sockfd , struct sockaddr * myaddr , int addrlen ) ; //这个调用将一个名字命名给一个没有名字的套接字 //第二个参数 myaddr

网络编程模型及TCP、UDP编程设计

南笙酒味 提交于 2020-02-23 14:42:12
1.Linux网络模型 Linux网络编程--->>>socket套接字的编程 2.TCP网络模型 UDP网络模型 在创建套接字后,服务器与客户端 都得 初始化网络地址 3.网络编程 服务器端: //1.1创建socket if((sockfd = socket(AF_INET, SOCK_STREAM, 0))<0) //IPv4,用于TCP通信 {perror("socket error!");exit(-1);} //确保连接稳定性 //1.2绑定地址 /*初始化地址*/ bzero(&server_addr,sizeof(struct sockaddr_in));//清零 server_addr.sin_family = AF_INET;//协议族 server_addr.sin_addr.s_addr = htonl(INADDR_ANY); //跟随网络传输 sin_addr中的成员s_addr 任意ip地址 字节序转换 主机转换为网络字节序 server_addr.sin_port = htons(port);//端口,跟随网络传输 /*绑定地址*/ if(bind(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))<0); //要绑定的地址 地址长度 {perror("bind

iOS中的Socket

∥☆過路亽.° 提交于 2020-02-23 05:42:36
一、 网络各个协议:TCP/IP、UDP、SOCKET、HTTP、FTP等 网络七层由下往上分别为物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。其中物理层、数据链路层和网络层通常被称作媒体层,是网络工程师所研究的对象;传输层、会话层、表示层和应用层则被称作主机层,是用户所面向和关心的内容。 http协议 对应于应用层 tcp协议 对应于传输层 ip协议 对应于网络层 三者本质上没有可比性。 何况HTTP协议是基于TCP连接的。 TCP/IP是传输层协议,主要解决数据如何在网络中传输;而HTTP是应用层协议,主要解决如何包装数据。我们在传输数据时,可以只使用传输层(TCP/IP),但是那样的话,由于没有应用层,便无法识别数据内容,如果想要使传输的数据有意义,则必须使用应用层协议,应用层协议很多,有HTTP、FTP、TELNET等等,也可以自己定义应用层协议。WEB使用HTTP作传输层协议,以封装HTTP文本信息,然后使用TCP/IP做传输层协议将它发送到网络上。Socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API),通过Socket,我们才能使用TCP/IP协议。 二、Http和Socket连接区别 2.1 TCP连接 要想明白Socket连接,先要明白TCP连接。手机能够使用联网功能是因为手机底层实现了TCP/IP协议

Tcp网络通讯详解

白昼怎懂夜的黑 提交于 2020-02-23 03:35:03
Tcp通讯 一款网络游戏分为客户端和服务端两个部分, 客户端程序运行在用户的电脑或手机上,服务端程序运行在游戏运营商的服务器上。多个客户端通过网络与服务端通信。TCP 连接指的是一种游戏中常用的网络通信协议, 与之对应的还有UDP 协议、KCP 协议、HTTP 协议等。本片文章只讨论Tcp通讯。 先来认识Socket 网络上的两个程序通过一个双向的通信连接实现数据交换, 这个连接的一端称为一个Socket。一个Socket包含了进行网络通信必需的五种信息:连接使用的协议、本地主机的IP地址、本地的协议端口、远程主机的IP地址和远程协议端口,如果把Socket理解成一台手机, 那么本地主机IP地址和端口相当于自己的手机号码, 远程主机IP地址和端门相当于对方的号码。至少需要两台手机才能打电话, 同样地, 至少需要两个Socket 才能进行网络通信。 理解IP地址和端口 IP地址 网络上的计算机都是通过IP地址识别的, 应用程序通过通信端口彼此通信。通俗地讲, 可以理解为每一个IP地址对应于一台计算机(实际上一台计算机可以有多个IP地址,此处仅作方便理解的解释)。 在Wmdows命令提示符中输入ipconfig, 便能够查看本机的IP地址,本地机进程间通信时Ip可使用:127.0.0.1。至于ipconfig查询出的ip与127.0.0.1之间的区别,可以自己百度 端口 “端口”

Socket异步发送的同步控制

人走茶凉 提交于 2020-02-23 03:18:42
在网络通信中,我们使用Socket异步发送数据,但在客户端,往往是需要等待服务器的返回结果后(握手过程)再往下执行,这就涉及到同步控制了,在多次的实现中,使用AutoResetEvent,实现不,即有时候发现,Socket数据返回比阻塞的UI线程快,不知道是Socket的优先级别高,还是什么原因。总之,这个同步控制是失败的。后来经研究,想到了解决办法,只要发送线程和接收线程同时对ThreadSemaphore进行操作,发送数据时调用Wait方法,收到Socket返回的数据时调用Set方法,问题解决。对于信号量的同步控制有很多场合的应该,不同的场合可以设计不同的实现。看了很多的实现,都是需求相对复杂的,而我的需求就是阻塞UI线程,等待服务器返回结果后再往下执行,所以只能参考别的实现,自己设计(下面程序没有经过测试,只是一个即时设计)。 public class ThreadSemaphore {   bool m_isSocketReturn;   public bool Wait(int timeout)   {     lock(this)     {       if (!m_isSocketReturn && !Monitor.Wait(this, timeout)          retun m_isSocketReturn;     }     retun m

socket套接字编程(一)

拈花ヽ惹草 提交于 2020-02-23 01:40:43
目录 套接字介绍 TCP套接字编程 服务端流程 客户端流程 tcp套接字数据传输特点 网络收发缓冲区 tcp粘包 UDP套接字编程 服务端流程 客户端流程 总结(tcp套接字和udp套接字编程区别) 补充(socket模块方法和socket套接字属性) 套接字介绍 套接字:实现网络编程进行数据传输的一种技术手段 Python实现套接字编程:import socket 套接字分类: 流式套接字(SOCK_STREAM):以字节流方式传输数据(可以理解为像水流一样传输),实现tcp网络传输方案。(面向连接–tcp协议–可靠的–流式套接字) 数据报套接字(SOCK_DGRAM):以数据报形式传输数据(可以理解为像一瓶一瓶的水一样传输),实现udp网络传输方案。(无连接–udp协议–不可靠–数据报套接字) TCP套接字编程 服务端流程 Created with Raphaël 2.2.0 socket bind listen accept send/recv close socket表示创建一个套接字(买了一个电话) bind用于绑定主机ip地址等信息(好比办了一张电话卡) listen设置监听,可以被其他套接字或程序连接的功能(充话费) accept处于等待状态(让电话处于待机状态) send/recv发送/接收(用电话) close销毁套接字(把电话摔了) 创建套接字 sockfd