第16章 网络IPC:套接字总结
1 套接字是通信端点的抽象
创建套接字:
int socket(int domain,int type,int protocol)
domain:通信域 AF_INET、AF_INET6、AF_LOCAL、AF_UNSPEC
type:套接字类型,SOCK_DGRAM、SOCK_STREAM、SOCK_SEQPACKET、SOCK_RAW
protocol:通常为0,表示domain和type默认的协议
linux中套接字使用文件描述符实现的,文件描述符上使用的大多数函数可以用于套接字
套接字输入输出:
int shutdown(int sockfd,int how)
how:SHUT_RD、SHUT_WR、SHUT_RDWR
2 网络寻址
字节序转换:
#include <arpa/inet.h>
uint32_t htonl(uint32_t hostint32)
uint16_t htons(uint16_6 hostint16)
uint32_t ntohl(uint32_5 netint32)
uint16_t ntohs(uint16_t netint16)
地址格式:
通用地址结构:
struct sockaddr
{
sa_family_t sa_family;
char sa_data[];
};
IPv4(AF_INET)地址格式
struct sockaddr_in
{
sa_family_t sin_family;
in_port_t sin_port;
struct in_addr sin_addr;
};
IPv6(AF_INET6)地址格式:
struct sockaddr_in6
{
sa_family_t sin6_family;
in_port_t sin6_port;
uint32_t sin6_flowinfo;
struct in6_addr sin6_addr;
uint32_t sin6_scope_id;
};
二进制与点分十进制格式转化函数:
const char *inet_ntop(int domain,void *addr,char *str,socklen_t size)
int inet_pton(int domain,const char *str,void *addr)
地址查询:
主机信息:
struct hostent
{
char *h_name;
char **h_aliases;
int h_addrtype;
int h_length;
char *h_addr_list;
}; #include <netdb.h>
struct hostent *gethostent()
void sethostent(int stayopen)
void endhostent()
网络信息:
struct netent
{
char *n_name;
char **n_aliases;
int n_addrtype;
uint32_t n_net;
}; #include <netdb.h>
struct netent *getnetbyaddr(uint32_t net,int type)
struct netent *getnetayname(const char *name)
struct netent *getnetent()
void setnetent(int stayopen)
void endnetent();
协议信息:
struct protoent
{
char *p_name;
char **p_aliases;
int p_proto;
};
#include <netdb.h>
struct protoent *getprotobyname(const char *name)
struct protoent *getprotobynumber(int proto)
struct protoent *getprotoent()
void setprotoent(int stayopen)
void endprotoent()
服务信息:
struct servent
{
char *s_name;
char **s_aliases;
int s_port;
char *s_proto;
};
#include <netdb.h>
struct servent *getservbyname(const char *name,const char *proto)
struct servent *getservbyprot(int port,const char *proto)
struct servent *getservent()
void setservent(int stayopen)
void endservent()
套接字与地址绑定:
#include <sys/socket.h>
绑定:
int bind(int sockfd,const struct sockaddr *addr,socklen_t len)
查看套接字绑定的地址:
int getsockname(int sockfd,struct sockaddr *addr,socklen_t len)
查看套接字连接的地址:
int getpeername(int sockfd,struct sockaddr *addr,socklen_t *len)
3 建立连接
#include <sys/socket.h>
int connect(int sockfd,struct sockaddr *addr,socklen_t len)
int listen(int sockfd,int backlog)
int accept(int sockfd,struct sockaddr *addr,socklen_t *len)
4 数据传输
#include <sys/socket.h>
ssize_t send(int sockfd,const void *buf,size_t nbytes,int flag)
flag:
MSG_DONTROUTE:勿将数据路由出本地网络
MSG_DONTWAIT:允许阻塞操作
MSG_EOR:如果协议支持,此为记录结束
MSG_OOB:如果协议支持,此为带外数据
#include <sys/socket.h>
ssize_t sendto(int sockfd,const char *buf,size_t nbytes,int flag,const struct sockaddr *destaddr,socklen_t destlen)
同send函数相比,允许非连接的套接字指定发送目标地址
第16章 网络IPC:套接字总结的更多相关文章
- UNIX环境高级编程 第16章 网络IPC:套接字
上一章(15章)中介绍了UNIX系统所提供的多种经典进程间通信机制(IPC):管道PIPE.命名管道FIFO.消息队列Message Queue.信号量Semaphore.共享内存Shared Mem ...
- 第十六章:网络IPC 套接字
一.IP地址和端口 套接字接口可以用于计算机间通信.目前计算机间使用套接字通讯需要保证处于同一网段. 为了查看是否处于同一网段,我们可以使用IP地址判断. IP地址是计算机在网络中的唯一标识.IP地址 ...
- Unix环境高级编程(十七)网络IPC套接字
通过网络套接字可以使得不同计算机上运行的进程相互通信. 1.创建套接字 #include <sys/socket.h> Int socket( int domain, int type, ...
- apue学习笔记(第十六章 网络IPC:套接字)
本章将考察不同计算机(通过网络连接)上的进程相互通信的机制:网络进程间通信. 套接字描述符 正如使用文件描述符访问文件,应用程序用套接字描述符访问套接字. 许多处理文件描述符函数(如read和writ ...
- unix网络编程第四章----基于TCP套接字编程
为了执行网络I/O操作.进程必须做的第一件事情就是调用Socket函数.指定期待的通信协议 #include<sys/socket.h> int socket(int family,int ...
- 网络编程 套接字socket TCP UDP
网络编程与套接字 网络编程 网络编程是什么: 网络通常指的是计算机中的互联网,是由多台计算机通过网线或其他媒介相互链接组成的 编写基于网络的应用程序的过程序称之为网络编程. 网络编程最主要的工 ...
- 《python核心编程》读书笔记--第16章 网络编程
在进行网络编程之前,先对网络以及互联网协议做一个了解. 推荐阮一峰的博客:(感谢) http://www.ruanyifeng.com/blog/2012/05/internet_protocol_s ...
- <网络编程>套接字介绍
1.端口:IANA(Internet Assigned Numbers Authority)维护着一个端口号分配状况的清单. 众所周知的端口(0-1023):由IANA分配和控制,可能的话,相同的端口 ...
- Java网络编程--套接字Socket
一.套接字Socket IP地址标志Internet上的计算机,端口号标志正在计算机上运行的进程(程序). 端口号被规定为一个16位的0--65535之间的整数,其中,0--1023被预先定义的服务通 ...
随机推荐
- Centos System Info
系统 # uname -a # 查看内核/操作系统/CPU信息 # head -n 1 /etc/issue # 查看操作系统版本 # cat /proc/cpuinfo # 查看CPU信息 # ho ...
- 微软2016校园招聘4月在线笔试 ABC
题目链接:http://hihocoder.com/contest/mstest2016april1/problems 第一题:输入N,P,W,H,代表有N段文字,每段有ai个字,每行有⌊W/S⌋个字 ...
- hadoop-2.6.0.tar.gz + spark-1.5.2-bin-hadoop2.6.tgz的集群搭建(单节点)
前言 本人呕心沥血所写,经过好一段时间反复锤炼和整理修改.感谢所参考的博友们!同时,欢迎前来查阅赏脸的博友们收藏和转载,附上本人的链接.http://www.cnblogs.com/zlslch/p/ ...
- [置顶] 使用U盘安装ubuntu系统
使用U盘安装ubuntu系统 在网上找了很多教程,都不起效,提示:“从光盘上读取数据出错”. 总结出了几个关键点. 首先,版本,Ubuntu 12.04 Server,一般的U盘安装都会报:“从光盘上 ...
- cocos2d-x学习笔记
转自:http://blog.csdn.net/we000636/article/details/8263503 接受触屏事件的优先级是值越小,响应触屏事件的优先级越高 Z值越大,越外面 JNI:允许 ...
- VM启用ISO共享
在SCVMM中可以启用ISO共享,如下图: 如果不勾选共享镜像复选框,则vmm会把镜像文件通过网络复制到Hyper-v主机下的虚拟机配置文件夹中 配置步骤如下: 1.新建一个共享文件夹(存放ISO), ...
- 【转】Java中Vector和ArrayList的区别
首先看这两类都实现List接口,而List接口一共有三个实现类,分别是ArrayList.Vector和LinkedList.List用于存放多个元素,能够维护元素的次序,并且允许元素的重复.3个具体 ...
- 路冉的JavaScript学习笔记-2015年1月23日
1.JavaScript的数据类型 A.原始类型:包含数值.字符串.布尔值.空值(null)和未定义值(undefined). Js原始类型均为不可改变类型.对不可变类型调用任何自带方法都不会改变原始 ...
- PureMVC(JS版)源码解析:总结
PureMVC源码中设计到的11个类已经全部解析完了,回首想想,花了一周的时间做的这点事情还是挺值得的,自己的文字组织表达能力和对pureMVC的理解也在写博客的过程中得到了些提升.我也是第一次写系列 ...
- Android(java)学习笔记162:Android启动过程(转载)
转载路径为: http://blog.jobbole.com/67931/ 1. 关于Android启动过程的问题: 当按下Android设备电源键时究竟发生了什么? Android的启动过程是怎么样 ...