【linux高级程序设计】(第十三章)Linux Socket网络编程基础 2
BSD Socket网络编程API
创建socket对象
int socket (int __domain, int __type, int __protocol) :成功返回socket文件描述符,失败返回-1.
参数1:socket对象使用的地址簇或协议簇

常用的有PF_LOCAL(本机通信)、PF_INET(IPv4协议簇)、PF_INET6(IPv6协议簇)
参数2:socket的类型。共有六种。常见有:面向连接的数据流方式;面向无连接的数据报方式
参数3:标识采用哪一种协议,0表示默认。
绑定本地IP地址与端口
int bind (int __fd, __CONST_SOCKADDR_ARG __addr, socklen_t __len) :成功返回0,失败返回-1
参数1:用于绑定本地IP的文件描述符
参数2:指向sockaddr结构的指针,标识本地地址信息。如果是IP地址,要求IP地址必须为本机IP地址,端口必须为一个未占用的本地端口。
sockaddr数据结构定义如下:
#define __CONST_SOCKADDR_ARG __const struct sockaddr *
struct sockaddr {
sa_family_t sa_family; //协议簇
char sa_data[]; //协议地址
};
sockaddr只提供地址类型规范,根据不同,需要选用不同的类型。
如果是UNIX套接字,即本机通信的套接字,socket需要与本地socket文件绑定。
#define __SOCKADDR_COMMON(sa_prefix) sa_family_t sa_prefix##family //##为宏连接
struct sockaddr_un
{
_SOCKADDR_COMMON (sun_); //协议AF_UNIX
char sun_path[]; //文件路径名 不能与系统文件名冲突 使用完后删除
};
IPV4网络通信,sockaddr的结构体应选用下面定义:
struct sockaddr_in
{
__SOCKADDR_COMMON(sin_); //协议AF_INET
in_port_t sin_port; //端口号
struct in_addr sin_addr; //IP地址
unsigned char sin_zero[sizeof(struct sockaddr) - _SOCKADDR_COMMON_SIZE - sizeof(in_port_t) - sizeof(struct in_addr)]; //预留位 以适应struct sockaddr位
};
其中IP地址的结构体定义为:
struct in_addr{
__u32 s_addr;
};
参数3:绑定的地址长度,一般sizeof求得。因为有多种地址类型。
监听网络
int listen (int __fd, int __n) 成功返回0,失败返回-1。
参数1:绑定了IP及端口的socket文件描述符
参数2:请求排队的最大长度。
客户端发起连接
int connect (int __fd, __CONST_SOCKADDR_ARG __addr, socklen_t __len) 成功返回0,失败返回-1.
参数1:socket文件描述符
参数2:连接的目的主机地址(包括IP地址和端口)
参数3:该地址长度
服务器接收连接
int accept (int __fd, __SOCKADDR_ARG __addr, socklen_t *__restrict __addr_len) 在监听到客户端连接请求时通过该函数接收,未监听到时阻塞。成功返回新的文件描述符,失败返回-1.
参数1:socket文件描述符
参数2:stuct sockaddr类型的地址空间首地址
参数3:该段地址空间的长度
服务器通过源IP、源端口、目的IP、目的端口来区分某个连接
读/写socket对象:默认以阻塞方式进行
ssize_t read (int __fd, void *__buf, size_t __nbytes) __wur 读文件内容
ssize_t write (int __fd, __const void *__buf, size_t __n) __wur 写文件内容
TCP发送/接收数据
ssize_t send (int __fd, __const void *__buf, size_t __n, int __flags) :发送数据。当第4个参数为0时与调用write一样。成功返回发送数据大小,失败返回-1.
ssize_t recv (int __fd, void *__buf, size_t __n, int __flags) :接收数据。 成功返回接收数据大小,失败返回-1.
参数1:目标socket对象
参数2:欲发送/接收的数据位置
参数3:欲发送/接收的数据大小
参数4:说明数据处理方式。如下图:

关闭socket对象
int close (int __fd) : 会关闭读写通道
int shutdown (int __fd, int __how) :有三种关闭方式。
- howto = 0 :关闭读通道
- howto = 1 :关闭写通道
- howto = 2 :完全关闭读写通道
获取socket本地/对端信息
int getsocketname (int __fd, __SOCKADDR_ARG __addr, socklen_t *__restrict __len) :获得一个套接字的本地地址。成功0,失败-1.
int getpeername (int __fd, __SOCKADDR_ARG __addr, socklen_t *__restrict __len) :获得已经连接上的套接字的远程信息,如IP地址和端口
【linux高级程序设计】(第十三章)Linux Socket网络编程基础 2的更多相关文章
- Socket网络编程-基础篇
Socket网络编程 网络通讯三要素: IP地址[主机名] 网络中设备的标识 本地回环地址:127.0.0.1 主机名:localhost 端口号 用于标识进程的逻辑地址 有效端口:0~65535 其 ...
- python全栈开发从入门到放弃之socket网络编程基础
网络编程基础 一 客户端/服务器架构 1.硬件C/S架构(打印机) 2.软件C/S架构 互联网中处处是C/S架构 如黄色网站是服务端,你的浏览器是客户端(B/S架构也是C/S架构的一种) 腾讯作为服务 ...
- 第九章:Python の 网络编程基础(一)
本課主題 何为TCP/IP协议 初认识什么是网络编程 网络编程中的 "粘包" 自定义 MySocket 类 本周作业 何为TCP/IP 协议 TCP/IP协议是主机接入互网以及接入 ...
- 【linux高级程序设计】(第十三章)Linux Socket网络编程基础 4
网络调试工具 tcpdump 功能:打印指定网络接口中与布尔表达式匹配的报头信息 关键字: ①类型:host(默认).net.port host 210.27.48.2 //指明是一台主机 net 2 ...
- 【linux高级程序设计】(第十三章)Linux Socket网络编程基础
IP地址定义: struct in_addr{ __u32 s_addr; }; in_addr_t inet_addr (__const char * __cp) :把点分十进制IP地址字符串转换 ...
- 第十三章:Python の 网络编程进阶(二)
本課主題 SQLAlchemy - Core SQLAlchemy - ORM Paramiko 介紹和操作 上下文操作应用 初探堡垒机 SQLAlchemy - Core 连接 URL 通过 cre ...
- 第十三篇:socket网络编程
本篇主要介绍网络编程的基础,以及UDP/TCP网络的socket编程,关于UDP套接字聊天器的实现.以及基于TCP套接字的服务器/客户端的实现上传下载功能. 一.网络通信 关于网络通信即通过网络(介质 ...
- socket网络编程基础小记
"一切皆Socket!" 话虽些许夸张.可是事实也是,如今的网络编程差点儿都是用的socket. --有感于实际编程和开源项目研究. 我们深谙信息交流的价值,那网络中进程之间怎样通 ...
- java架构《Socket网络编程基础篇》
本章主要介绍Socket的基本概念,传统的同步阻塞式I/O编程,伪异步IO实现,学习NIO的同步非阻塞编程和NIO2.0(AIO)异步非阻塞编程. 目前为止,Java共支持3种网络编程模型:BIO.N ...
随机推荐
- startActivityForResult 请求码不正确
今天遇到一个坑,就是 startActivityForResult 接收不到正确的请求码. 比如,我startActivityForResult的时候,设置的请求码是4,但是接收到的时候是100032 ...
- Active Directory 域服务 (AD DS) 虚拟化
TechNet 库 Windows Server Windows Server 2012 R2 和 Windows Server 2012 服务器角色和技术 Active Directory Acti ...
- X的N次方。N比较大。
final static long DIV = 1000000009; //分治法, 注意java类型为long, C++为__int64或 long long public static long ...
- Android学习笔记(一)之仿正点闹钟时间齿轮滑动的效果
看到正点闹钟上的设置时间的滑动效果非常好看,自己就想做一个那样的,在网上就开始搜资料了,看到网上有的齿轮效果的代码非常多,也非常难懂,我就决定自己研究一下,现在我就把我的研究成果分享给大家.我研究的这 ...
- SQL Server VALUES 使用一记住
VALUES 用得最多,最常见的就是 INSER INOT 表名(列名1,列名2,......) VALUES(值1,值2,......) ------------------------------ ...
- Java8 时间处理
Table of Contents 前言 时间单位和时区 时间点 时间段 时间的解析和格式化 时区时间 兼容旧接口 结语 前言 时间处理是一个经常会用到但又不那么好用的功能,其中的主要问题在于对人友好 ...
- 【java并发编程实战】第一章笔记
1.线程安全的定义 当多个线程访问某个类时,不管允许环境采用何种调度方式或者这些线程如何交替执行,这个类都能表现出正确的行为 如果一个类既不包含任何域,也不包含任何对其他类中域的引用.则它一定是无状态 ...
- HDU 4681 String 胡搞
设串C的第一个字母在串A中出现的位置是stA, 串C的最后一个字母在串A中出现的位置是edA. 设串C的第一个字母在串B中出现的位置是stB, 串C的最后一个字母在串B中出现的位置是edB. 求出每一 ...
- SVN客户端使用手册
使用svn进行源代码版本控制,代码管理利器. 优点: 使用方便,与文件管理器集成.速度快,稳定. 实现代码比较,比如对历史和当前代码进行比较. 解决多人同时编写代码时代码重复修改困难. 安装: 下载网 ...
- PHP上传多文件
知识点: 一.$_FILES数组 ①.$_FILES['filename']['name']上传文件原名 ②.$_FILES['filename']['tmp_name']上传成功后的缓存文件名 ③. ...