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:套接字总结的更多相关文章

  1. UNIX环境高级编程 第16章 网络IPC:套接字

    上一章(15章)中介绍了UNIX系统所提供的多种经典进程间通信机制(IPC):管道PIPE.命名管道FIFO.消息队列Message Queue.信号量Semaphore.共享内存Shared Mem ...

  2. 第十六章:网络IPC 套接字

    一.IP地址和端口 套接字接口可以用于计算机间通信.目前计算机间使用套接字通讯需要保证处于同一网段. 为了查看是否处于同一网段,我们可以使用IP地址判断. IP地址是计算机在网络中的唯一标识.IP地址 ...

  3. Unix环境高级编程(十七)网络IPC套接字

    通过网络套接字可以使得不同计算机上运行的进程相互通信. 1.创建套接字 #include <sys/socket.h> Int socket( int domain, int type, ...

  4. apue学习笔记(第十六章 网络IPC:套接字)

    本章将考察不同计算机(通过网络连接)上的进程相互通信的机制:网络进程间通信. 套接字描述符 正如使用文件描述符访问文件,应用程序用套接字描述符访问套接字. 许多处理文件描述符函数(如read和writ ...

  5. unix网络编程第四章----基于TCP套接字编程

    为了执行网络I/O操作.进程必须做的第一件事情就是调用Socket函数.指定期待的通信协议 #include<sys/socket.h> int socket(int family,int ...

  6. 网络编程 套接字socket TCP UDP

    网络编程与套接字 网络编程 网络编程是什么: ​ 网络通常指的是计算机中的互联网,是由多台计算机通过网线或其他媒介相互链接组成的 ​ 编写基于网络的应用程序的过程序称之为网络编程. 网络编程最主要的工 ...

  7. 《python核心编程》读书笔记--第16章 网络编程

    在进行网络编程之前,先对网络以及互联网协议做一个了解. 推荐阮一峰的博客:(感谢) http://www.ruanyifeng.com/blog/2012/05/internet_protocol_s ...

  8. <网络编程>套接字介绍

    1.端口:IANA(Internet Assigned Numbers Authority)维护着一个端口号分配状况的清单. 众所周知的端口(0-1023):由IANA分配和控制,可能的话,相同的端口 ...

  9. Java网络编程--套接字Socket

    一.套接字Socket IP地址标志Internet上的计算机,端口号标志正在计算机上运行的进程(程序). 端口号被规定为一个16位的0--65535之间的整数,其中,0--1023被预先定义的服务通 ...

随机推荐

  1. Weblogic 集群部署说明 --转

    代理web.xml 设置 <servlet> l                <servlet-name>HttpClusterServlet</servlet-nam ...

  2. obj-c 名词

    类:     Class (description/template for an object)实例: Instance (manifestation of a class)消息: Message ...

  3. HDU 1102 Constructing Roads (最小生成树)

    最小生成树模板(嗯……在kuangbin模板里面抄的……) 最小生成树(prim) /** Prim求MST * 耗费矩阵cost[][],标号从0开始,0~n-1 * 返回最小生成树的权值,返回-1 ...

  4. poj 2367 Genealogical tree (拓扑排序)

    火星人的血缘关系很奇怪,一个人可以有很多父亲,当然一个人也可以有很多孩子.有些时候分不清辈分会产生一些尴尬.所以写个程序来让n个人排序,长辈排在晚辈前面. 输入:N 代表n个人 1~n 接下来n行 第 ...

  5. freemaker分页备忘

    思路:定义一个freemaker宏,接收参数.然后在freemaker页面上import这个文件,把参数传进来在server端渲染. 分页标签:pager.ftl <#-- 自定义的分页指令. ...

  6. HBase 学习笔记---守护进程及内存调优

    1.HMaster           HMaster的任务前面已经说过了,两个大方向:一.管理Hbase Table的 DDL操作 二.region的分配工作,任务不是很艰巨,但是如果采用默认自动s ...

  7. Code Smell那么多,应该先改哪一个?

    博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:Code Smell那么多,应该先改哪一个?.

  8. PowerDesigner实用方法小结(1)

    PowerDesigner使用方法小结 PowerDesigner多用来进行数据库模型设计,具有SQL语句自动生成等功能.当然,也有不少缺点,比如团队分享. 一.设置PowerDesigner模型视图 ...

  9. [GIF] GIF Loop Coder - Interpolation

    This video discusses the default interpolation in GIF Loop Coder, and four distinct ways to change t ...

  10. [HTTP] Origins, CROS, Preflight

    Origins made up of three parts the data scheme, the hostname and the prot. It is important to know t ...