Socket编程(day14)
一、基于TCP传输层的编程模型
TCP是面向连接的,安全可靠的。
三次握手
服务器端编程模型
、创建一个用于网络通讯的设备 通讯端点
socket()
#include <sys/types.h>
#include <sys/socket.h>
int socket(int domain, int type, int protocol);
功能:创建一个用于通讯的端点
参数:
domain:
AF_INET:应用于IPV4地址家族的
AF_INET6:应用于IPV6地址家族的
type:
SOCK_STREAM:可靠的、基于连接的 双向的、队列式的 TCP
SOCK_DGRAM:支持数据包 不可靠的 无连接的 UDP protocol: 返回值:
- 错误 errno被设置
返回一个新的文件描述符 、将这个通讯端点和本机的ip地址、端口号做绑定
bind()
int bind(int sockfd, const struct sockaddr *addr,
socklen_t addrlen);
功能:绑定名字到地址。创建socket以后,socket中有地址空间但是没有具体地址放在这个地址空间。需要将具体的地址和socket的地址空间绑定。
参数:
sockfd:已经创建好的socket,但是这个socked没有具体的地址
addr:指定了具体的地址,将这个地址绑定到sockfd中
addrlen:指定了addr的大小、字节数
返回值:
成功
- 错误 errno被设置 地址家族的通用结构 struct sockaddr{
sa_family_t sa_family;
char sa_data[];
}; ipv4和ipv6
man in.h
#include <netinet/in.h>
in_port_t uint16_t
in_addr_t uint32_t
sa_family_t <sys/socket.h> struct in_addr{
in_addr_t s_addr;
}; ipv4的具体地址
struct sockaddr_in{
sa_family_t sin_family; //AF_INET.
in_port_t sin_port; //Port number.
struct in_addr sin_addr; //IP address.
}; INADDR_ANY IPv4 local host address
这是一个宏,宏的本质是一个整数。代表了本机的所有的地址。 端口号 ~
但是5000以下最好不要用。因为已经被国际组织使用了。 sin_port 采用网络字节序
需要将本机字节序的数字转换为网络字节序
系统提供了函数。处理本机字节序和网络字节序的问题
#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 netshort); h host n net
s short l long to ip地址 字符串格式 二进制格式 互相转换
inet_pton()
#include <arpa/inet.h>
int inet_pton(int af, const char *src, void *dst);
功能:从字符串格式转换为二进制格式 IPV4 IPV6
参数:
af:
AF_INET or AF_INET6 src:字符串格式的ip地址
dst:存储了网络地址结构的信息
返回值:
成功
src无效
- 错误 errno被设置 struct in_addr #include <arpa/inet.h>
const char *inet_ntop(int af, const void *src,
char *dst, socklen_t size);
功能:二进制到字符串的转化
参数:
af:
AF_INET or AF_INET6
src: struct in_addr
dst:用来存储字符串的空间
size:指定了空间的有效字节数
返回值:
NULL 错误 errno被设置
非空 返回dst的地址,字符串的首地址。 ip地址 127.0.0.1 本地地址 环回地址
测试机器的网络设备工作是否正常。 setsockopt() 、在这个通讯端点上监听客户端连接的到来,如果有连接的到来,将到达的连接存放在缓冲区中(队列的数据结构)
listen()
int listen(int sockfd, int backlog);
功能:在socket监听连接。将sockfd标记为被动连接。接收即将到来的客户端请求。
参数:
sockfd:指定了被监听的socket
backlog:指定了未决连接的最大数。
返回值:
成功
- 错误 errno被设置 、从这个缓冲区队列中取出一个客户端连接,返回一个连接描述符用于和客户端的通讯。(这个连接描述符称为conn_fd)
accept()
int accept(int sockfd, struct sockaddr *addr, \
socklen_t *addrlen);
功能:在socket上接收一个连接
参数:
sockfd:指定了监听的socket
addr:在这个地址空间里填充了客户端的地址和端口号
addrlen:空间里指定了addr的长度。如果addr为NULL,那么也要设置为NULL
返回值:
- 错误 errno被设置
返回一个非负的整数,就是连接描述符 、使用conn_fd和客户端通讯
()获取客户端的请求
read()
()处理客户端请求
()响应客户端
write() 、关闭conn_fd,终止和客户端的通讯
close(conn_fd); 客户端的编程模型
、创建一个用于通讯的设备(通讯端点)
socket()
、使用这个端点连接到服务器(IP地址和端口号)
connect()
int connect(int sockfd, const struct sockaddr *addr,
socklen_t addrlen);
功能:在socket上发起一个连接
参数:
sockfd:指定socket,将这个socket连接到addr的地址空间
addr:指定具体的地址空间,要连接到的地址空间。server
addrlen:指定了addr的长度
返回值:
成功
- 错误 errno被设置 、向服务器发送消息
、等待服务器端的响应消息
、处理服务器的响应消息
、关闭设备,结束本次通讯。 举例说明 编写基于TCP的通讯模型
服务器端代码 参见 server.c
客户端代码参见 client.c
172.30.3.93 二、并发服务器的实现
三种方法实现服务器的并发 多进程 多线程 多路复用
使用多进程实现服务器的并发功能
什么时候?什么地方?子进程才登场。
fork() 子进程负责的任务
子进程负责和客户端的通讯
关闭s_fd。
信息处理
关闭和客户端的连接 父进程负责的任务
父进程负责从未决连接队列中取出一个连接,创建和客户端通讯的文件描述符
创建子进程 关闭和客户端的连接
负责对子进程收尸。非阻塞收尸
Socket编程(day14)的更多相关文章
- Linux下的C Socket编程 -- server端的继续研究
Linux下的C Socket编程(四) 延长server的生命周期 在前面的一个个例子中,server在处理完一个连接后便会立即结束掉自己,然而这种server并不科学啊,server应该是能够一直 ...
- java socket编程(li)
一.网络编程中两个主要的问题 一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输.在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可以 ...
- Python Socket 编程——聊天室示例程序
上一篇 我们学习了简单的 Python TCP Socket 编程,通过分别写服务端和客户端的代码了解基本的 Python Socket 编程模型.本文再通过一个例子来加强一下对 Socket 编程的 ...
- Linux下的C Socket编程 -- server端的简单示例
Linux下的C Socket编程(三) server端的简单示例 经过前面的client端的学习,我们已经知道了如何创建socket,所以接下来就是去绑定他到具体的一个端口上面去. 绑定socket ...
- Linux下的C Socket编程 -- 获取对方IP地址
Linux下的C Socket编程(二) 获取域名对应的IP地址 经过上面的讨论,如果我们想要连接到远程的服务器,我们需要知道对方的IP地址,系统函数gethostbyname便能够实现这个目的.它能 ...
- Linux下的C Socket编程 -- 简介与client端的处理
Linux下的C Socket编程(一) 介绍 Socket是进程间通信的方式之一,是进程间的通信.这里说的进程并不一定是在同一台机器上也有可能是通过网络连接的不同机器上.只要他们之间建立起了sock ...
- python网络编程-socket编程
一.服务端和客户端 BS架构 (腾讯通软件:server+client) CS架构 (web网站) C/S架构与socket的关系: 我们学习socket就是为了完成C/S架构的开发 二.OSI七层 ...
- Socket编程实践(2) Socket API 与 简单例程
在本篇文章中,先介绍一下Socket编程的一些API,然后利用这些API实现一个客户端-服务器模型的一个简单通信例程.该例子中,服务器接收到客户端的信息后,将信息重新发送给客户端. socket()函 ...
- Socket编程实践(1) 基本概念
1. 什么是socket socket可以看成是用户进程与内核网络协议栈的编程接口.TCP/IP协议的底层部分已经被内核实现了,而应用层是用户需要实现的,这部分程序工作在用户空间.用户空间的程序需要通 ...
- [转]C语言SOCKET编程指南
1.介绍 Socket编程让你沮丧吗?从man pages中很难得到有用的信息吗?你想跟上时代去编Internet相关的程序,但是为你在调用 connect() 前的bind() 的结构而不知所措?等 ...
随机推荐
- MySQL批量SQL插入各种性能优化
对于一些数据量较大的系统.数据库面临的问题除了查询效率低下,还有就是数据入库时间长.特别像报表系统,每天花费在数据导入上的时间可能会长达几个小时或十几个小时之久.因此.优化数据库插入性能是非常有意义的 ...
- joinColumns和inverseJoinColumns的使用方法
近期在工作中使用springside.里面用到了hibernate的多对多 一開始我在配置department(部门表)和menu(栏目表)的时候.这样写的. Department实体类中的getMe ...
- Java 递归、尾递归、非递归、栈 处理 三角数问题
import java.io.BufferedReader; import java.io.InputStreamReader; //1,3,6,10,15...n 三角数 /* * # 1 * ## ...
- Android 组件ContentProvider
Android 组件ContentProvider Android的数据存储有五种方式Shared Preferences.网络存储.文件存储.外储存储.SQLite,一般这些存储都仅仅是在单独的一个 ...
- cocos2d-x开发的《派对小游戏》-github源代码分享
这是博主非常久曾经写的一个cocos2d-x跨平台小游戏,我称它为<派对小游戏>,如今分享给大家.希望对大家有所帮助的话. 项目源代码地址:https://github.com/xieba ...
- 【POJ 1456】 Supermarket
[题目链接] http://poj.org/problem?id=1456 [算法] 贪心 + 堆 [代码] #include <algorithm> #include <bitse ...
- B2321 [BeiJing2011集训]星器 数学&&物理
这个题貌似特别奇怪,根本什么算法都想不出来,然而...看完题解之后,竟然用了能量守恒?惊了! 这里有一个题解: https://blog.csdn.net/Mima_Reincarnation/art ...
- Linux防火墙设置
对于Internet上的系统,不管是什么情况都要明确一点:网络是不安全的.因此,虽然创建一个防火墙并不能保证系统100%安全,但却是绝对必要的. Linux提供了一个非常优秀的防火墙工具-netfil ...
- ECharts-热力图实例
1.引入echarts.js 2.页面js代码 //用ajax获取所需要的json数据 $.get("../../../mall/queryPageWtSrPost.do", { ...
- [Swift]LeetCode1071.字符串的最大公因子 | Greatest Common Divisor of Strings
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...