一、基于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)的更多相关文章

  1. Linux下的C Socket编程 -- server端的继续研究

    Linux下的C Socket编程(四) 延长server的生命周期 在前面的一个个例子中,server在处理完一个连接后便会立即结束掉自己,然而这种server并不科学啊,server应该是能够一直 ...

  2. java socket编程(li)

    一.网络编程中两个主要的问题 一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输.在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可以 ...

  3. Python Socket 编程——聊天室示例程序

    上一篇 我们学习了简单的 Python TCP Socket 编程,通过分别写服务端和客户端的代码了解基本的 Python Socket 编程模型.本文再通过一个例子来加强一下对 Socket 编程的 ...

  4. Linux下的C Socket编程 -- server端的简单示例

    Linux下的C Socket编程(三) server端的简单示例 经过前面的client端的学习,我们已经知道了如何创建socket,所以接下来就是去绑定他到具体的一个端口上面去. 绑定socket ...

  5. Linux下的C Socket编程 -- 获取对方IP地址

    Linux下的C Socket编程(二) 获取域名对应的IP地址 经过上面的讨论,如果我们想要连接到远程的服务器,我们需要知道对方的IP地址,系统函数gethostbyname便能够实现这个目的.它能 ...

  6. Linux下的C Socket编程 -- 简介与client端的处理

    Linux下的C Socket编程(一) 介绍 Socket是进程间通信的方式之一,是进程间的通信.这里说的进程并不一定是在同一台机器上也有可能是通过网络连接的不同机器上.只要他们之间建立起了sock ...

  7. python网络编程-socket编程

     一.服务端和客户端 BS架构 (腾讯通软件:server+client) CS架构 (web网站) C/S架构与socket的关系: 我们学习socket就是为了完成C/S架构的开发 二.OSI七层 ...

  8. Socket编程实践(2) Socket API 与 简单例程

    在本篇文章中,先介绍一下Socket编程的一些API,然后利用这些API实现一个客户端-服务器模型的一个简单通信例程.该例子中,服务器接收到客户端的信息后,将信息重新发送给客户端. socket()函 ...

  9. Socket编程实践(1) 基本概念

    1. 什么是socket socket可以看成是用户进程与内核网络协议栈的编程接口.TCP/IP协议的底层部分已经被内核实现了,而应用层是用户需要实现的,这部分程序工作在用户空间.用户空间的程序需要通 ...

  10. [转]C语言SOCKET编程指南

    1.介绍 Socket编程让你沮丧吗?从man pages中很难得到有用的信息吗?你想跟上时代去编Internet相关的程序,但是为你在调用 connect() 前的bind() 的结构而不知所措?等 ...

随机推荐

  1. Eclipse启动时提示fail to create the Java Virtual Machine问题的解决

    今天偶然打开Eclipse.发现无法打开,出现例如以下提示: 后来经过上网查询.发现是eclipse.ini文件的问题,打开eclipse安装文件夹下的eclipse.ini文件: -startup ...

  2. HDU 5387 Clock (MUT#8 模拟)

    [题目链接]:pid=5387">click here~~ [题目大意]给定一个时间点.求时针和分针夹角,时针和秒针夹角,分针和秒针夹角 模拟题,注意细节 代码: #include&l ...

  3. MFC的UI更新机制和加速键的创建

    近期在看<MFC Windows程序设计>这本书,正好看到更新菜单中的菜单项和加入菜单项的加速键这方面的内容,下面总一下总结. MFC提供的更新菜单项的机制例如以下: 通过消息映射表中的O ...

  4. web 前端学习笔记

    <!DOCTYPE HTML> <head> <style type="text/css"> body {  background: #ff00 ...

  5. E20170905-mk

    recursive   adj. 回归的,递归的;

  6. 原生JS---2

    js中的程序控制语句 常见的程序有三种执行结构: 1. 顺序结构 2. 分支结构 3. 循环结构 顺序结构:程序从第一行开始执行,按顺序执行到最后一行 分支结构:就像一条岔路口,必须选择且只能选择其中 ...

  7. C# 创建单例

        private static WorkFlow instance = null;         private static readonly object syncObj = new ob ...

  8. Visual Studio q启动卡顿

    在开发人员CMD下面执行 Devenv.exe /ResetSettings ,然后顺利打开 总发现vs2015经常把cpu给占满了,导致电脑卡的不要不要的.这是CodeLens引起的,因为装了VAs ...

  9. POJ 1172 DFS

    (感谢wzc学长的幻灯片) 单组数据 注意从必经点能到标记过的点则此点不是分裂点. //By: Sirius_Ren #include <cstdio> #include <queu ...

  10. B - Taxi(贪心)

    Problem description After the lessons n groups of schoolchildren went outside and decided to visit P ...