头文件

#include<unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include<sys/un.h> #include <netinet/in.h>
#include<string.h> #include <arpa/inet.h>

socket()

//创建网络端点,返回socket文件描述符,失败返回-1设errno
int socket(int domain, int type, int protocol);

domain :协议族(protocol family)(网络通讯(IP)还是本地通讯(xxx.socket))

  • AF_LOCAL本地通讯/AF_UNIX/
  • AF_INET用于实现给予ipv4网络协议的网络协议
  • AF_INET6用于实现给予ipv6网络协议的网络协议
  • AF_IPXIPX - Novell protocols
  • AF_NETLINKKernel user interface device
  • AF_X25 ITU-T X.25 / ISO-8208 protocol
  • AF_AX25 Amateur radio AX.25 protocol
  • AF_ATMPVC Access to raw ATM PVCs
  • AF_APPLETALK Appletalk
  • AF_PACKET Low level packet interface

type :协议(TCP还是UDP还是其他的)

  • SOCK_STREAM //流式套接字, 实现包括但不限于TCP协议,which is有序,可靠双向面向连接的字节流通信方式
  • SOCK_DGRAM //数据报套接字, 实现包括但不限于UDP协议, which is不可靠,无连接的数据报通信方式
  • SOCK_SEQPACKET
  • SOCK_RAW //原始套接字,可以编写自己的传输层协议
  • SOCK_RDM
  • SOCK_PACKET

can be bitwised:

  • SOCK_NONBLOCK //将O_NONBLOCK文件状态标识符放在新打开的文件描述符上,将打开的文件设为非阻塞。也可以通过fcntl()达到同样的目的
  • SOCK_CLOEXEC //将 close-on-exec (FD_CLOEXEC)文件标识符放在新打开的文件描述符上。参见open()

    protocol: 特殊协议, 一般给0

Note:

虽然socket返回的sockfd就是一个文件描述符,但不是所有的以文件描述符为参数的函数都可以操作sockfd,比如,和管道文件一样,sockfd同样不能被lseek()操作,下面是一些以文件描述符为参数的函数在操作sockfd时的行为(取自《UNIX环境高级编程》P476)

close()         //释放sockfd
Dup(),dup2() //和一般的文件描述符一样复制
fchdir() //失败
fchmod() //未指定
fchown() //由实现定义
fcntl() //支持一些命令,eg:F_DUFD,F_DUPFD_CLOEXEC,F_GETFD,F_GETFL,F_GETOWN,F_SETFD,F_SETFL,F_SETOWN
Fdatasync()和fsync() //
fstat() //由实现定义
ftruncate() //未指定
ioctl() //支持部分指令,依赖于底层驱动
lseek() //由实现定义,失败会设errno为ESPIPE
mmap() //未指定
poll() //正常工作
read()/readv() //与没有flag的recv()等价
select() //正常工作
write()/writev() //与没有flag的write()等价

getsockopt()/setsockopt()

//获得sockfd指向的socket的属性
int getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen);
//设置sockfd指向的socket的属性,成功返回0,失败返回-1设errno。
int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen);

level :选项级别

  • SOL_SOCKET:指定设置属性在socket API层次,即通用socket选项
  • IPPROTO_IP:IP选项。
  • IPPROTO_TCP:TIP选项。

optname:选项名

  • SO_BROADCAST:广播

optval:存放选项值的缓冲区地址

optlen:缓冲区长度

准备通信地址:

struct sockaddr{	//主要用于函数的形参类型, 很少定义结构体变量使用, 叫做通用的通信地址类型//$man bind
sa_family_t sa_family;
char sa_data[14];
}
struct sockaddr_un{ //准备本地通信的通信地址 //$man un.h
sa_family_t sun_family;//协议族,就是socket()的domain的AF_LOCAL
char sun_path[];//文件的路径
}
struct sockaddr_in{ //准备网络通信的通信地址 //$man in.h
sa_family_t sin_family; //协议族, 就是socket()的domain的AF_INET
in_port_t sin_port; //端口号
struct in_addr sin_addr; //IP地址
}
struct in_addr{
in_addr_t s_addr; //整数类型的IP地址
}

htonl()/htons()/ntohl()/ntohs()

//主机和网络字节序转换
uint32_t htonl(uint32_t hostlong);converts the unsigned integer hostlong from host byte order to network byte order.
uint16_t htons(uint16_t hostshort);converts the unsigned short integer hostshort from host byte order to network byte order.
uint32_t ntohl(uint32_t netlong); converts the unsigned integer netlong from network byte order to host byte order.
uint16_t ntohs(uint16_t netshort); converts the unsigned short integer netshort from network byte order to host byte

inet_aton()/inet_addr()/inet_lnaof()/inet_netof()/inet_network()/inet_ntoa()/inet_makeaddr()

//IP地址格式转换,返回对应格式的IP地址
int · inet_aton(const char *cp, struct in_addr *inp);
in_addr_t inet_addr(const char *cp); //将字符串形式的IP地址转换为整数类型
in_addr_t inet_lnaof(struct in_addr in);
in_addr_t inet_netof(struct in_addr in);
in_addr_t inet_network(const char *cp);
char* inet_ntoa(struct in_addr in); //将结构体类型的IP地址转换为字符串类型
struct in_addr inet_makeaddr(int net, int host);

bind()

//把通信端口(可能还有地址)和socket文件描述符绑定,用在服务器端,成功返回0,失败返回-1设errno
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

sockfd: socket文件的fd(returned by socket())

addr: 需要强制类型转换成socketaddr_un或soketaddr_in, 参见上

addrlen: 通信地址的大小, 使用sizeof();

Note:一个网卡一个MAC和一个ip地址,如果将地址置为INADDR_ANY(就是0),那么表示从所有的网卡接收消息,如果希望只接收特定网卡的消息,就需要将其ip地址与socket绑定

connect():

//初始化一个socket的连接,用在客户端,成功返回0,失败返回-1设errno
int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);

sockfd: socket文件的fd(returned by socket())

addr: 需要强制类型转换成socketaddr_un或soketaddr_in, 参见上

addrlen: 通信地址的大小, 使用sizeof();

shutdown()

//将一个socket设为不活动状态。成功返回0,失败返回-1设errno
int shutdown(int sockfd, int how);

sockfd:socket文件的文件描述符

how:shutdown的方式

  • SHUT_RD关闭socket的读端
  • SHUT_WR关闭socket的写端
  • SHUT_RDWR关闭socket的读端和写端

当我们close(sockfd)的时候,其实是使引用该文件的文件描述符个数-1,只有当所有引用该文件的文件描述符都被close()时,这个文件才会真正被释放,比如我们在close一个文件描述符之前调用了dup()来复制这个文件描述符,那么这个文件描述符指向的文件表其实还是存在的。当这里的文件描述符指的是socketfd时也是同样的道理。而shutdown()可以直接将该sockfd指向的socket设为不活动状态,那么其他指向该socket的fd也会直接受到影响

网络信息检索函数

//获取主机名
gethostname(); //获取与socket相连的远程协议的地址
getscokname() //获得本地socket协议地址
getsockname() //根据主机名获得主机信息
gethostbyname() //根据主机地址取主机信息
gethostbyaddr() //根据协议名取得主机协议信息
getprotobyname() //根据协议号取得主机协议信息
getprotobynumber() //根据服务名取得相关服务信息
getservbyname() //根据端口号取得相关服务信息
getservbyport()

Linux IPC BSD socket编程基础的更多相关文章

  1. Linux基础与Linux下C语言编程基础

    Linux基础 1 Linux命令 如果使用GUI,Linux和Windows没有什么区别.Linux学习应用的一个特点是通过命令行进行使用. 登录Linux后,我们就可以在#或$符后面去输入命令,有 ...

  2. LINUX下C语言编程基础

    实验二 Linux下C语言编程基础 一.实验目的 1. 熟悉Linux系统下的开发环境 2. 熟悉vi的基本操作 3. 熟悉gcc编译器的基本原理 4. 熟练使用gcc编译器的常用选项 5 .熟练使用 ...

  3. 【转】Linux基础与Linux下C语言编程基础

    原文:https://www.cnblogs.com/huyufeng/p/4841232.html ------------------------------------------------- ...

  4. socket编程基础-字节序/IP/PORT转换/域名

    socket编程基础 网络IP操作函数 字符串的IP和32位的IP转换 #include <sys/socket.h> #inlcude <netinet/in.h> #inc ...

  5. Linux学习之socket编程(二)

    Linux学习之socket编程(二) 1.C/S模型——UDP UDP处理模型 由于UDP不需要维护连接,程序逻辑简单了很多,但是UDP协议是不可靠的,实际上有很多保证通讯可靠性的机制需要在应用层实 ...

  6. Java Socket编程基础(1)

    参考资料: <Java网络编程精解> 孙卫琴 一.socket通信简介 什么是socket,简单来说,在linux系统上,进程与进程之间的通信称为IPC,在同一台计算机中,进程与进程之间通 ...

  7. Linux学习之socket编程(一)

    socket编程 socket的概念: 在TCP/IP协议中,“IP地址+TCP或UDP端口号”唯一标识网络通讯中的一个进程,“IP地址+端口号”就称为socket. 在TCP协议中,建立连接的两个进 ...

  8. socket编程基础

    socket编程 什么是socket 定义 socket通常也称作套接字,用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过套接字向网络发出请求或者应答网络请求. socket起源于Unix ...

  9. <转>Socket编程——基础介绍

    最近系统的看了下unix网络编程的一些内容,对socket的理解有了进一步的加深,在看APUE的时候,那会儿看socket上面介绍的比较少,只是模糊的懂了如何去写一个简单的TCP服务端和客户端,对其中 ...

随机推荐

  1. linux下硬盘的分区:

    提到硬盘的分区,以前就是很乱,有什么主分区/扩展分区/逻辑分区等;它们有什么区别呢?现在简单的了解一下: 由于在MBR的主引导记录中的分区表里面最多只能记录4个分区记录,这个不够用啊,为了解决这个问题 ...

  2. 高性能分布式哈希表FastDHT

    高性能分布式哈希表FastDHT介绍及安装配置 FastDHT-高效分布式Hash系统 FastDHT(分布式hash系统)安装和与FastDFS整合实现自定义文件ID Centos6.3 停安装 F ...

  3. ViewBag和ViewDate以及TempDate的区别

    简单的说,就是   ViewBag 和  ViewData 是数据共享的(他们都是共享 ViewData 的数据),ViewBag 实际就是对 ViewData的一个操作的封装.  区别 : View ...

  4. 内存与cpu的关系

    CPU是负责运算和处理的,内存是交换数据的.当程序或者操作者对CPU发出指令,这些指令和数据暂存在内存里,在CPU空闲时传送给CPU,CPU处理后把结果输出到输出设备上,输出设备就是显示器,打印机等. ...

  5. Oracle中已知字段名查询所在的表名

    select table_name from user_tab_columns where column_name = '字段名'; 这是网上查到的,地址如下:http://blog.163.com/ ...

  6. 手机浏览器中屏蔽img的系统右键菜单context menu

    我们知道通过oncontextmenu事件可以屏蔽浏览器右键菜单 $('img').on("contextmenu",function(E){E.preventDefault(); ...

  7. Java编程思想学习笔记——初始化与清理

    初始化 构造器保证初始化 构造器采用与类相同的名称. 默认构造器(default constructor):不接受任何参数的构造器,也叫无参构造器. 构造器也能带有形式参数,就能在初始化对象时提供实际 ...

  8. (Dos)/BAT命令入门与高级技巧详解(转)

    目录 第一章 批处理基础 第一节 常用批处理内部命令简介 1.REM 和 :: 2.ECHO 和 @ 3.PAUSE 4.ERRORLEVEL 5.TITLE 6.COLOR 7.mode 配置系统设 ...

  9. Oracle:oracle 12.1.0.2 升级到12.2.0.1 后,自动任务报错:ORA-20001: Statistics Advisor: Invalid task name for the current user

    具体错误如下:关键字:ORA-12012.ORA-20001 ORA-12012: error on auto execute of job "SYS"."ORA$AT_ ...

  10. Python基础教程学习笔记:第一章 基础知识

    Python基础教程 第二版 学习笔记 1.python的每一个语句的后面可以添加分号也可以不添加分号:在一行有多条语句的时候,必须使用分号加以区分 2.查看Python版本号,在Dos窗口中输入“p ...