第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设置在同一窗口打开文件夹
默认情况下,CentOS双击文件夹会打开一个新窗口.这对于习惯Windows的用户会感觉非常别扭.其实,如果用鼠标中键双击文件夹,就不会打开新窗口了.当然,也可以按照如下设置: 1. 打开任意一个文 ...
- Linux必学的命令
Linux必学的命令Linux提供了大量的命令,利用它可以有效地完成大量的工作,如磁盘操作.文件存取.目录操作.进程管理.文件权限设定等.所以,在Linux系统上工作离不开使用系统提供的命令.要想真正 ...
- poj 2117 Electricity【点双连通求删除点后最多的bcc数】
Electricity Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 4727 Accepted: 1561 Descr ...
- win7下禁用ctrl alt del +上下左右键
1.控制面板 2.屏幕分辨率 3.高级设置 4.英特尔图形和媒体控制面板 5.图形属性 6.选项和支持 7.快捷键管理器 8.去掉启动前的勾
- php的fread函数的一个巨大的坑
先看看fread的manual,如下: http://php.net/manual/en/function.fread.php fread() reads up to length bytes fro ...
- tensorflow 实现线性方程
下面的直接是代码: #!usr/bin/env python#coding:utf-8"""这个代码的作用是 通过 tensorflow 来计算 y = 0.3x + 0 ...
- sping获取bean方法 解决资源耗尽
// ApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"applicationCon ...
- [Javascript] Object.freeze() vs Object.seal()
let person = { firstName: "Zhentian", lastName: "Wan" }; /*Object.freeze() makes ...
- [Javascript] Immute Object
Three ways to make object immutable: 1. Use JSON.parse(JSON.stringify(obj)): this approach is little ...
- QT线程(二)---线程同步
线程互斥 多线程运行时,通常会访问同一个变量,同一个数据结构,或者同一段代码.因此,需要使用互斥技术来保护上述资源,确保多线程执行的正确性. 注: 我们通常说某个函数是线程安全的,也就是因为该函数 ...