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. HW5.14

    public class Solution { public static void main(String[] args) { System.out.printf("%s\t%s\n&qu ...

  2. HDU4763 - Theme Section(KMP)

    题目描述 给定一个字符串S,要求你找到一个最长的子串,它既是S的前缀,也是S的后缀,并且在S的内部也出现过(非端点) 题解 CF原题不解释....http://codeforces.com/probl ...

  3. 如何在Maven官网下载到历史版本

    历史版本一般会隔一段时间,便找不到,官网会及时显示的是最新版本.不多说,直接进入. https://archive.apache.org/dist/maven/binaries/ 成功在Maven官网 ...

  4. js定时显示广告代码

    这是一则定时显示广告的javascript代码,当然也可以定时显示某一区块内容,很实用. 代码如下: function strToDate(str, ext) { if (str == null || ...

  5. (二 )VMware workstation 部署虚拟集群实践——并行批量操作环境部署

    在上一篇博客中,已经介绍了安装虚拟集群的过程和需要注意的细节问题. 这篇主要是介绍如何批量登陆远程主机和配置,这个过程中是在没有部署并行处理工具或者集群管理工具的前进行的. ------------首 ...

  6. C#基础知识-对象初始化顺序

    本文章转载:http://blog.csdn.net/forever_wind/article/details/7442503 不错的文章:http://www.cnblogs.com/McJerem ...

  7. 【03】尽可能使用const

    1.为什么搞出const关键字? const指定一个语义约束,指定一个对象不可修改.如果一个对象不可修改,就应该说出来. 2.const与指针 const可以修饰指向之物,也可以修改指针本身.STL中 ...

  8. OpenWRT加入 crontab开机默认运行

    [转载请注明出处:钱国正专栏 http://blog.csdn.net/qianguozheng/article/details/37666829] OpenWRT系统默认已经加入了crond,仅仅是 ...

  9. [React ] React Fundamentals: Component Lifecycle - Mounting Usage

    The previous lesson introduced the React component lifecycle mounting and unmounting. In this lesson ...

  10. Android Studio中Gradle使用详解

    一)基本配置 build配置 buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools. ...