服务器编程

socket套接字编程

匿名 (未验证) 提交于 2019-12-02 22:56:40
网络基础概念 IP地址: 在IP协议中用来标识网络中不同主机的地址; IPv4:IP地址是一个4字节,32位的整数; IPv6是一个16字节,128位的整数。 端口号: 用来标识网络中唯一的一个网络服务进程,一个端口号只能被一个进程占用 一个进程可以绑定多个端口号,但是一个端口号只能被一个进程绑定 网络字节序: 发送主机通常将发送缓冲区的数据按内存地址从低到高的顺序发出; 接收主机把从网络上接受的字节依次保存在接收缓冲区中,按内存地址从低到高顺序保存; 所以,网络字节流的地址应该这样规定:先发出的数据是低地址,后发出去的数据是高地址。 TCP/IP协议规定网络数据流应采用大端字节序,即低地址高字节,不管这台主机是大端还是小端,都需要按照TCP/IP规定的网络字节序接受/发送数据。 如果当前主机是小端,需要先将数据转换成大端,否则忽略直接发送。 为提高网络程序的可移植性,使同样的C代码在大端机和小端机上编译后都能正常运行,可以调用库函数做网络字节序和主机字节序之间的转换。 #include<arpa/inet.h> uint32_t htonl(uint32_t hostlong); uint16_t htons(uint16_t hostshort); uint32_t ntohl(uint32_t netlong); uint16_t ntohs(uint16_t

【linux下c语言服务器开发系列3】进程间通讯

给你一囗甜甜゛ 提交于 2019-12-01 16:24:20
上个博文说道,信号是在进程间通讯的的一种方式。例如子进程执行结束后,向父进程发送sigchld信号,父进程就通过捕获这个信号,就可以对子进程的资源进行回收,避免其成为僵尸进程。 进程间通信的另外一种方式是管道,主要是在父子进程间。父进程通过创立一个管道,fork()出子进程后,子进程继承父进程的管道,从而,父子进程就形成了管道的两端,从而可以靠这两端,进行父子进程之间的通信。 创建管道 创建管道的方法主要有两种,一种是pipe函数,可以man一下,解释很清晰的;另外一种是socketpair函数。前者创建的管道是半双工的,后者的是全双工的。 下面是一个父子进程间通讯的一个小例子。连接见 http://git.oschina.net/mengqingxi89/codelittle/blob/master/codes/echoserver/ipc_shared_talker.cpp 例子中有个小问题没有解决,就是父进程往管道里写数据,如果写的过快的话,导致子进程没有接到。所以我让父进程写一句,sleep(1),然后再写。这样,子进程就都收到了。我想,可能是管道没有存储的功能?多写的话,就写不进去了。不知道。 进程间通讯的另一个方式是共享内存。这个,我要在下面的聊天室程序里介绍,这里就没介绍了。 #include"head.h" #define MAX_USER 1024 #define

Python Socket编程1

浪尽此生 提交于 2019-12-01 13:53:22
socket的定义   Socket是应用层与 TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中, Socket其实就是一个门面模式,它把复杂的 TCP/IP协议族隐藏在 Socket接口后面,对用户来说,一组简单的接口就是全部,让 Socket去组织数据,以符合指定的协议。 所以,我们无需深入理解tcp/udp协议,socket已经为我们封装好了,我们只需要遵循socket的规定去编程,写出的程序自然就是遵循tcp/udp标准的。 补充:也有人将socket说成ip+port,ip是用来标识互联网中的一台主机的位置,而port是用来标识这台机器上的一个应用程序,ip地址是配置到网卡上的,而port是应用程序开启的,ip与port的绑定就标识了互联网中独一无二的一个应用程序,而程序的pid是同一台机器上不同进程或者线程的标识 套接字发展史及分类   套接字起源于 20 世纪 70 年代加利福尼亚大学伯克利分校版本的 Unix,即人们所说的 BSD Unix。 因此,有时人们也把套接字称为“伯克利套接字”或“BSD 套接字”。一开始,套接字被设计用在同 一台主机上多个应用程序之间的通讯。这也被称进程间通讯,或 IPC。套接字有两种(或者称为有两个种族),分别是基于文件型的和基于网络型的。 基于文件类型的套接字家族 套接字家族的名字:AF_UNIX unix一切皆文件

Linux C编程

╄→尐↘猪︶ㄣ 提交于 2019-11-30 16:22:58
Linux C网络编程 1.Linux套接字 1.1 套接字介绍 套接字(Sockets),即为网络进程ID,是由运行这个进程的计算机的IP地址和这个进程使用的端口(Port)组成. 可以只用'netstat-all' 查看当前系统中网络应用进程的套接字和端口. 可以使用 > 输出重定向到文件. 1.2 套接字的结构 Linux在头文件<sys/socket.h>中定义了通用的套接字结构类型,可供不同协议调用 struct sockaddr { unsigned short int sa_family; //表示套接字的协议类型,如常见的IPv4,IPv6 unsigned char sa_data[14]; //14个字节的协议地址,包含了IP地址和端口 } 除了sockaddr之外,Linux还在<netinet/in.h>中定义了另外一种结构类型 sockaddr_in ,它和sockaddr等效且可以互相转换.通常用于TCP/IP协议 struct sockaddr_in { int sa_len; //长度单位,通常使用默认值16 short int sa_family; //协议族 unsigned short int sin_port; //端口号 struct in_addr sin_addr; //IP地址 unsigned char sin_zero[8]; /

Linux socket编程示例

左心房为你撑大大i 提交于 2019-11-29 13:52:04
一、socket编程    网络功能是Uinux/Linux的一个重要特点,有着悠久的历史,因此有一个非常固定的编程套路。   基于TCP的网络编程:     基于连接, 在交互过程中, 服务器和客户端要保持连接, 不能断开。重发一切出错数据、数据验证, 保证数据的正确性、完整性和顺序性,     缺点是消耗的资源比较大。   基于UDP的网络编程:     无连接协议, 在网络交互过程中不保持连接, 只需要在发送数据时连接一下, 不重发、验证数据。优点是资源消耗少, 数据的可靠性完整性     顺序性得不到保证。 二、编程步骤:     服务器:       ① 创建socket(套接字) socket()       ② 准备通信地址       ③ 将创建的socket和通信地址绑定 bind()       ④ 监听端口 listen()       ⑤ 等待客户端连接 accpet()       ⑥ 通信双方收发数据 read()/write()                  send()/recv()       ⑦ 关闭socket     客户端:       ① 创建socket(套接字) socket()       ② 准备通信地址       ③ 连接服务器 connect()       ④ 收发数据 read()/write()          

学习游戏服务器编程进阶篇之全球同服技术架构

不想你离开。 提交于 2019-11-29 13:25:09
笔者介绍: 姜雪伟 ,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,国家专利发明人;已出版书籍:《手把手教你 架构 3D游戏引擎》电子工业出版社和《 Unity3D 实战核心技术详解》电子工业出版社等。 CSDN视频网址: http://edu.csdn.net/lecturer/144 服务器架构技术一直是技术热点,比如比较流行的游戏服务器,各种数据平台系统等等都离不开服务器的架构设计,服务器架构设计的好坏直接决定了用户对产品使用的体验,在互联网时代,全世界用户或者玩家的距离已经开始变的越来越小,我们做的各种平台设计要能满足全球用户的使用已经成为了现实,数据的共享已经成为当前急需解决的问题。 游戏服务器在这块技术也已经打通,比如COC海盗奇兵,皇室战争游戏,它们的架构设计采用的就是全球同服架构设计,很多开发者对此感觉很难,其实利用现有的开源技术我们同样可以自己搭建一个全球同服的服务器,而且可以满足实时在线玩家几万到几十万人。下面将搭建全球同服服务器涉及到的技术给读者一一介绍: 全球同服 第一个摆在我们面前的问题是时间问题,地球上不同的国家,他们的时差是不同的,不同的时差的人要实现全球同服,需要在服务器这块处理好,解决方案是需要在不同的地区布置一组服务器,这些服务器数据最终要统一到一个数据库中,比如中国大陆玩家可以通过香港服务器登陆到美国服务器

JAVA 通过 Socket 实现 TCP 编程

99封情书 提交于 2019-11-29 11:11:40
简介 TCP简介 TCP(Transmission Control Protocol 传输控制协议)是一种面向 连接的 、 可靠的 、 基于字节流 的传输层通信协议,由IETF的RFC 793定义。在简化的计算机网络OSI模型中,它完成第四层 传输层 所指定的功能,用户数据报协议(UDP,下一篇博客会实现)是同一层内 另一个重要的传输协议。在因特网协议族(Internet protocol suite)中,TCP层是位于IP层之上,应用层之下的中间层。不同主机的应用层之间经常需要可靠的、像管道一样的连接,但是IP层不提供这样的流机制,而是提供不可靠的包交换。 应用层向TCP层发送用于网间传输的、用8位字节表示的数据流,然后TCP把数据流分区成适当长度的报文段(通常受该计算机连接的网络的数据链路层的最大传输单元( MTU)的限制)。之后TCP把结果包传给IP层,由它来通过网络将包传送给接收端实体的TCP层。TCP为了保证不发生丢包,就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的包发回一个相应的确认(ACK);如果发送端实体在合理的往返时延(RTT)内未收到确认,那么对应的数据包就被假设为已丢失将会被进行重传。TCP用一个校验和函数来检验数据是否有错误;在发送和接收时都要计算校验和。 JAVA Socket简介 所谓socket

【Socket编程】通过Socket实现TCP编程

安稳与你 提交于 2019-11-29 11:11:12
通过Socket实现TCP编程 Socket通信 : 1.TCP协议是 面向对象连接、可靠的、有序的 ,以 字节流 的方式发送数据。 2.基于TCP协议实现网络通信的类: 客户端----Socket类 服务器端----ServerSocket类 一、通信过程(Socket通信模型) Socket通信模型用下图所示: 1、在服务端建立一个ServerSocket,绑定相应的端口,并且在指定的端口进行侦听,等待客户端的连接。 2、当客户端创建连接Socket并且向服务端发送请求。 3、服务器收到请求,并且接受客户端的请求信息。一旦接收到客户端的连接请求后,会创建一个链接socket,用来与客户端的socket进行通信。 通过相应的输入/输出流进行数据的交换,数据的发送接收以及数据的响应等等。 4、当客户端和服务端通信完毕后,需要分别关闭socket,结束通信。 Socket通信实现步骤: 了解Socket通信模型后,就可以简化出Socket通信的实现步骤: 1.创建ServerSocket和Socket 2.打开链接到Socket的输入/输出流 3.按照协议对Socket进行读/写操作 4.关闭输入输出流、关闭Socket 二、Socket和ServerSocket常用方法 ServerSocket常用方法: ServerSocket(int port)—

C#网络编程二:Socket编程

落爺英雄遲暮 提交于 2019-11-29 11:10:01
一:什么是SOCKET socket的英文原义是“孔”或“插座”。作为进程通信机制,取后一种意思。通常也称作“套接字”,用于描述IP地址和端口,是一个通信链的句柄(其实就是两个程序通信用的)。 socket非常类似于电话插座。以一个电话网为例:电话的通话双方相当于相互通信的2个程序,电话号码就是ip地址。任何用户在通话之前,首先要占有一部电话机,相当于申请一个socket;同时要知道对方的号码,相当于对方有一个固定的socket。然后向对方拨号呼叫,相当于发出连接请求。对方假如在场并空闲,拿起电话话筒,双方就可以正式通话,相当于连接成功。双方通话的过程,是一方向电话机发出信号和对方从电话机接收信号的过程,相当于向socket发送数据和从socket接收数据。通话结束后,一方挂起电话机相当于关闭socket,撤销连接。 1、套接字分类 为了满足不同程序对通信质量和性能的要求,一般的网络系统都提供了以下3种不同类型的套接字,以供用户在设计程序时根据不同需要来选择: 流式套接字(SOCK_STREAM):提供了一种可靠的、面向连接的双向数据传输服务。实现了数据无差错,无重复的发送,内设流量控制,被传输的数据被看做无记录边界的字节流。在TCP/IP协议簇中,使用TCP实现字节流的传输,当用户要发送大批量数据,或对数据传输的可靠性有较高要求时使用流式套接字。 数据报套接字(SOCK

Python之并发编程(九)线程队列、Event事件、协程

回眸只為那壹抹淺笑 提交于 2019-11-28 22:53:51
线程队列、Event事件、协程 线程队列 先进先出示例: import queue #不需要通过threading模块里面导入,直接import queue就可以了,这是python自带的 #用法基本和我们进程multiprocess中的queue是一样的 q=queue.Queue() q.put('first') q.put('second') q.put('third') # q.put_nowait() #没有数据就报错,可以通过try来搞 print(q.get()) print(q.get()) print(q.get()) # q.get_nowait() #没有数据就报错,可以通过try来搞 ''' 结果(先进先出): first second third ''' 先进后出(Lifo堆栈)示例: import queue q=queue.LifoQueue() #队列,类似于栈,栈我们提过吗,是不是先进后出的顺序啊 q.put('first') q.put('second') q.put('third') # q.put_nowait() print(q.get()) print(q.get()) print(q.get()) # q.get_nowait() ''' 结果(后进先出): third second first ''' 优先级队列示例 import