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. UVa11584 - Partitioning by Palindromes(区间DP)

    题目大意 给定一个小写字母组成的字符串S,你的任务是划分成尽量少的回文串 题解 方程就是dp[j]=min(dp[i-1]+1)(i<=j,s[i..j]是回文串) 代码: #include&l ...

  2. Add And Reset a Federation Server to a Federation Server Farm adfs ad

    Applies To: Active Directory Federation Services (AD FS) 2.0 After you install the Active Directory ...

  3. gcc编译选项的循环重复查找依赖库等命令

    link时,若liba.a依赖libb.a,若这样写 -lb -la,则链接通不过,gcc有个选项:-Xlinker ,可以让gcc在链接时反复查找依赖库,用法 : gcc -shared -o li ...

  4. eas bos 编辑界面 editUIt 属性值为空

    在编辑界面,我们可以正常的保存某个值到数据库,同时列表界面也可以正常显示. 但是当我们再次打开这个编辑界面的时候,该属性值缺无法显示. 通常情况下,通过下面两个方法可以解决 方法一: 在编辑界面重写一 ...

  5. Robot Framework自动化测试(二)第一个用例

    RIDE启动界面: 首先创建一个Test project File-New Project ,选择Directory类型 在创建的文件夹上右键,创建一个Test Suite Openbaidu, NE ...

  6. 【转】bootbox自定义dialog、confirm、alert样式,以及基本设置方法setDefaults中可用参数

    <html> <head> <meta charset="utf-8"> <meta name="viewport" ...

  7. DataSet、DataTable和DataGridView知识备忘

    datatable中,获取第i行j列的单元格内容:             string str = DataSet.Tables[0].Rows[i][j].ToString():datagridv ...

  8. bootstrap-table对前台页面表格的支持

    1.bootstrap-table是在bootstrap的基础上面做了一些封装,所以在使用bootstrap-table之前要导入的js和css有 1)基本的还是jQuery <script t ...

  9. JBPM数据库表说明

    http://blog.163.com/tigerlion@126/blog/static/167675665201072642627400/ 最近这几天一直在研究JBPM工作流引擎,以下为JBMP的 ...

  10. freemarker 数字,字符的操作

    1. 数据类型转换: ${xx?string} //字符串 ${xx?number}//整数 ${xx?currency}//小数 ${xx?percent}//百分比 2. 截取字符串长度 有的时候 ...