socket网络编程TCP中C/S架构函数框架

服务器端

创建套接字 socket( )
填充服务器网络信息结构体 sockaddr_in
将套接字与服务器网络信息结构体绑定 bind( )
将套接字设置为被动监听状态 listen( )
阻塞等待客户端的连接请求 accept( )
进行通信 recv( )/send( )

客户端

创建套接字 socket( )
填充服务器网络信息结构体 sockaddr_in
发送客户端的连接请求 connect( )
进行通信 send( )/recv( )

socket( )
	#include <sys/types.h>          /* See NOTES */
    #include <sys/socket.h>

int socket(int domain, int type, int protocol);
	功能:创建一个套接字,返回一个文件文件描述符
	参数:
		domain 通信域,协议族
			AF_UNIX 本地通信
			AF_INET ipv4网络协议
			AF_INET6 ipv6网络协议
		type:类型
			SOCK_STREAM 流式套接字,tcp
			SOCK_DGRAM 数据报套接字,UDP
			SOCK_RAW 原始套接字
		protocol:再次添加的协议,一般为0,表示单一协议	
	返回值:
		成功:文件描述符
		失败:-1
		
	例子:
		int sockfd;
		if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
		{
			perror("fail to socket");
			//return -1;
			exit(1);
		}
		

	
bind( )
	#include <sys/types.h>          /* See NOTES */
    #include <sys/socket.h>

    int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
	功能:将套接字与网络信息结构体绑定
	参数:
		sockfd:文件描述符,socket的返回值
		addr:网络信息结构体
			通用的(一般不用):
				struct sockaddr {
					sa_family_t sa_family; 2个字节
					char        sa_data[14];  14个字节
				}
				
			网络信息结构体:sockaddr_in
				#include <netinet/in.h>
				
				struct sockaddr_in
				{
					__SOCKADDR_COMMON (sin_);
						==>
							#define __SOCKADDR_COMMON(sa_prefix) \                                                                           
									sa_family_t sa_prefix##family   
						==>
							在函数宏里面,##代表字符串的拼接
							sa_family_t sin_family;   地址族 AF_INET  2个字节

					in_port_t sin_port;  端口号 2个字节
					
					struct in_addr sin_addr; 
						==>
							struct in_addr                                                                                                   
							{ 
								in_addr_t s_addr;  ip地址 4个字节
							};

				
					这个没有用,为了使得sockaddr_in与sockaddr一样大
					unsigned char sin_zero[sizeof (struct sockaddr) -
							__SOCKADDR_COMMON_SIZE -
							sizeof (in_port_t) -
							sizeof (struct in_addr)];                                                                         
				};
		addrlen:addr的长度
	返回值:
		成功:0
		失败:-1
		
	例子:
		struct sockaddr_in serveraddr;
		serveraddr.sin_family = AF_INET;
		serveraddr.sin_port = htons(8888);
		serveraddr.sin_addr.s_addr = inet_addr("192.168.1.189");
		
		if(bind(sockfd, (struct sockaddr *)&serveraddr, sizeof(struct sockaddr_in)) < 0)
		{
			perror("fail to bind")exit(1);
		}
		

listen( )
	#include <sys/types.h>          /* See NOTES */
    #include <sys/socket.h>

    int listen(int sockfd, int backlog);
	功能:将套接字设置为被动监听的状态
	参数:
		sockfd:文件描述符,socket的返回值
		backlog:允许同时响应客户端连接请求的个数,一般为510
	返回值:
		成功:0
		失败:-1
		
	例子:
		if(listen(sockfd, 5) < 0)
		{
			perror("fail to listen");
			exit(1);
		}
		

accept( )
	#include <sys/types.h>          /* See NOTES */
    #include <sys/socket.h>

    int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
	功能:阻塞等待客户端的连接请求
	参数:
		sockfd:文件描述符,socket的返回值
		addr:被填充的客户端的网络信息结构体
		addrlen:addr的长度
	返回值:
		成功:新的文件描述符(用于与客户端通信)
		失败:-1
	
	例子:
		int acceptfd;
		struct sockaddr_in clientaddr;
		socklen_t addrlen = sizeof(struct sockaddr);
		
		if((acceptfd = accept(sockfd, (struct sockaddr *)&clientaddr, &addrlen)) < 0)
		{
			perror("fail to accept");
			exit(1);
		}


connect( )
	#include <sys/types.h>          /* See NOTES */
    #include <sys/socket.h>

    int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
	功能:发送客户端连接请求
	参数:
		sockfd:文件描述符,socket的返回值
		addr:自己填充的服务器的网络信息结构体
		addrlen:addr的长度
	返回值:
		成功:0
		失败:-1
	
	例子:
		if(connect(sockfd, (struct sockaddr *)&serveraddr, sizeof(serveraddr)) < 0)
		{
			perror("fail to connect");
			exit(1);
		}

send( )
	#include <sys/types.h>
    #include <sys/socket.h>

    ssize_t send(int sockfd, const void *buf, size_t len, int flags);
	功能:发送数据
	参数:
		sockfd:文件描述符
			服务器:accept的返回值
			客户端:socket的返回值
		buf:发送的数据
		len:buf的长度
		flags:标志位
			0  阻塞(默认的状态)
			MSG_DONTWAIT 非阻塞
	返回值:
		成功:发送的数据的长度
		失败:-1


recv( )
	#include <sys/types.h>
    #include <sys/socket.h>

    ssize_t recv(int sockfd, void *buf, size_t len, int flags);
	功能:接收数据
	参数:
		sockfd:文件描述符
			服务器:accept的返回值
			客户端:socket的返回值
		buf:接收到的数据
		len:buf的长度
		flags:标志位
			0  阻塞(默认的状态)
			MSG_DONTWAIT 非阻塞
	返回值:
		成功:接收的数据的长度
			0 发送方关闭对应文件描述符
		失败:-1
写在前面的话: 基于HPSocket开发的C/S快速开发框架,引用怪兽群的话“不要怀疑HPSocket,有问题多看DEMO!”,这是对HPSocket稳定高效的最佳诠释!所以,基于HPSocket设计了一些周边功能,方便大家快速开发软件!那么,模块究竟有什么功能呢? 1、数据库连接池: 目前仅支持MYSql数据库,支持设定初始和最大连接数、支持请求超时、支持心跳、支持最大和最小空闲数、支持最大空闲时间检测等等各项功能。至于连接池是用来干什么的,简单的说就是用空间换时间,提前搞N个连接,当有sql请求的时候,从这N个连接选取空闲连接进行数据库操作。 2、线程池: 这个线程池最大的亮点就是支持线程优先级。啥意思?比如数据库进行增删改操作,又有cha询操作,那么增删改的优先级肯定是要高于cha询优先级的。 3、上传池和下载池: 支持多线程、4G+文件、多客户Duan同时收发,自动分包组包。 4、缓存池: 相信很多人都喜欢用内存搞缓存池,但是搞的多了,回收再不及时的话,容易造成内存泄露。所以,这个缓存池采用临时文件读写方式进行操作,效率虽说逊色内存操作,但是其他方面的优越性是内存缓存池无法比拟的!比如在硬盘空间允许的情况下,缓存池可以无限大,缓存池可以长时间存在,而不用担心内存爆掉的问题。 5、CExcel: 封装了EXCEL相关COM调用方式,命令简洁易懂; 6、CJson: 封装了JS3,支持快速生成和解析JSON文本; 7、参数表: 用于SQL参数化处理!这有啥用?SQL注入攻击相信大家都听过,使用这个方法可以杜绝SQL注入攻击; 8、请求池: 顾名思义,用于处理请求的!这个有啥好说道说道的?规范了请求格式,参数有通信密钥、 协yi头、请求参数、附加数据,支持生成同时含有文本和字节集的请求!另外,请求内部处理了签名问题!啥意思?类似于sign签名,保证请求一致性和完整性。 9、日志池: 支持多线程、多日志同时读写; 10、事件池: 支持多事件同时处理; 11、提示框: 当鼠标悬停在控件上,会跳出提示。封装了tooltips,命令稍微优化了下,更简洁明了。 ············· ⊙﹏⊙b汗,实在吹不下去了,容易被各位大佬XXX·············
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值