====网络通信====
#include <sys/socket.h>
int socket(int domain, int type, int protocol);
创建套接字,domain的值如下:
AF_UNIX     unix域套接字,本地使用
AF_INET     IPV4套接字
AF_INET6    IPV6套接字

type有两种: SOCK_STREAM(TCP流), SOCK_DGRAM(UDP流)
protocol基本恒为0,极少数会去设置它
返回0成功创建,-1失败

#include <sys/socket.h>
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
绑定套接字到addr地址,返回0成功,-1失败

#include <sys/socket.h>
int listen(int sockfd, int backlog);
监听套接字链接,成功返回0,-1失败

#include <sys/socket.h>
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
接受客户的链接,返回一个文件描述符,出错返回-1值

#include <sys/socket.h>
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
建立到addr地址的链接,成功返回0,失败返回-1值

#include <sys/socket.h>
ssize_t recvfrom(int sockfd, void *buffer, size_t length, int flags,
    struct sockaddr *src_addr, socklen_t *addrlen);
接受UDP数据,成功返回接受的字节数,返回0表示接受完成,-1出错
ssize_t sendto(int sockfd, const void *buffer, size_t length,
    int flags, const struct sockaddr *dest_addr, socklen_t addrlen);
发送UDP数据,成功返回实际发送的字节数,返回-1出错

UNIX套接字地址结构
struct sockaddr_un {
    sa_family_t sun_family; /* 永远等于AF_UNIX */
    char sun_path[108];     /* 域路径名称,以'\0'结束 */
};

#include <sys/socket.h>
int socketpair(int domain, int type, int protocol, int sockfd[2]);
用于进程之间,创建unix域套接字,成功返回0,-1失败

#include <arpa/inet.h>
uint16_t htons(uint16_t host_uint16);
uint16主机字节序转换为网络字节序

uint32_t htonl(uint32_t host_uint32);
uint32主机字节序转换为网络字节序

uint16_t ntohs(uint16_t net_uint16);
uint16网络字节序转换位主机字节序

uint32_t ntohl(uint32_t net_uint32);
uint32网络字节序转换位主机字节序

struct in_addr {
    in_addr_t s_addr    /*无符号的32位整数 */
};

struct sockaddr_in {
    sa_family_t     sin_family; /* 永远标为AF_INET */
    in_port_t       sin_port    /* 端口 */
    struct in_addr  sin_addr;   /* IP地址 */
    unsinged char   __pad[X];   /* 仅用于结构对齐 */
};
sin_port,sin_addr是网络字节序

struct in6_addr {
    uint8_t s6_addr[16];    /* IP6地址 */
};

struct sockaddr_in6 {
    sa_family_t     sin6_family;    /*永远标为AF_INET6 */
    in_port_t       sin6_port;      /* 端口 */
    uint32_t        sin6_flowinfo;  /* IPV6 FLOW INFO */
    struct in6_addr sin6_addr;      /* IPV6地址 */
    uint32_t        sin6_scope_id;  /* 新增的(kernel2.4以上) */
};
全部结构都是网络字节序

#include <arpa/inet.h>
int inet_pton(int domain, const char *src_str, void *addrptr);
转换字符串格式的IP地址为对应的结构体, 返回0成功,-1出错

const char *inet_ntop(int domain, const void *addrptr,
    char *dst_str, size_t len);
转换地址结构体为对应的字符串格式,返回0成功,-1出错

#include <sys/socket.h>
#include <netdb.h>
int getaddrinfo(const char *host, const char *service,
    const struct addrinfo *hints, struct addrinfo **result);
得到hostname,或是service name的IP地址信息,返回0成功,-1失败

#include <sys/socket.h>
#include <netdb.h>
void freeaddrinfo(struct addrinfo *result);
释放上面函数获得IP地址信息,分配的内存

#include <sys/socket.h>
int shutdown(int sockfd, int how);
关闭套接字,方式如下:
1.SHUT_RD   关闭读
2.SHUT_WR   关闭写
返回0表示成功,-1出错

#include <sys/socket.h>
int getsockname(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
int getpeername(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
返回本地/对端的套接字地址信息,返回0成功,-1失败

#include <sys/sendfile.h>
ssize_t sendfile(int out_fd, int in_fd, off_t *offset, size_t count);
通过套接字传输一个文件的内容,返回传输的字节数,返回-1出错

include <sys/socket.h>
int getsockopt(int sockfd, int level, int optname,
    void *optval, socklen_t *optlen);
int setsockopt(int sockfd, int level, int optname,
    const void *optval, socklen_t optlen);
获取/设置套接字的属性,返回0成功,-1失败

转载于:https://www.cnblogs.com/y2ghost/p/4364271.html

Linux编程网络通信相关推荐

  1. Linux 编程经典书籍推荐

    成为一名精通 Linux 程 序设计的高级程序员一直是不少朋友孜孜以求的目标.根据中华英才网统计数据,北京地区 Linux 程序员月薪平均为 Windows 程序员的 1.8 倍.Java 程序员的 ...

  2. Unix/Linux编程:进程间通信(IPC)总结

    IPC工具分类 如上,Unix系统上IPC根据功能可以分为三类 通信:这些工具关注进程间的数据交换 同步:这些进程关注进程和线程操作之间的同步 信号:虽然信号的主要作用不为此,但是在特定场景下仍然可以 ...

  3. linux编程书籍推荐

    2019独角兽企业重金招聘Python工程师标准>>> Linux编程推荐书籍一览表 Linux编程推荐书籍一览表 shell 编程 <LINUX与UNIX SHELL编程指南 ...

  4. Linux编程题:信号量同步三进程依次打印若干次ABC

    三个进程依次打印ABC..... 思路及大致流程如下: 思路取自这位大哥: Linux编程题:创建3个线程分别打印abc,用信号量进行同步_cleverlemon的博客-CSDN博客 这位大哥写的是线 ...

  5. linux编程取消wait函数,Linux编程基础之进程等待(wait()函数).pdf

    Linux编程基础之进程等待(wait()函数) 编程过程中,有时需要让一个进程等待另一个进程 ,最常见的是父进程等待自己的子进程 ,或者父进程回收自己 的子进程资源包括僵尸进程.这里简单介绍一下系统 ...

  6. linux的编程命令,linux编程常用命令

    学习linux编程最基本的就是要掌握常用的编程命令,下面由学习啦小编为大家整理了linux编程常用命令相关知识,希望大家喜欢! linux编程常用命令1.编译应用程序 make -f makefile ...

  7. Linux 编程中的API函数和系统调用的关系【转】

    转自:http://blog.chinaunix.net/uid-25968088-id-3426027.html 原文地址:Linux 编程中的API函数和系统调用的关系 作者:up哥小号 API: ...

  8. 学习Unix/Linux编程要学些什么

    最近利用空余时间看了一下<Unix/Linux编程实践教程>,原书名为:Understanding Unix/Linux Programming: A Guide to Theory an ...

  9. Linux编程下open()函数的用法

    Linux编程下open()函数的用法 open(打开文件)  相关函数:  read,write,fcntl,close,link,stat,umask,unlink,fopen 表头文件 : #i ...

最新文章

  1. linux cache控制 内核,linux内核之bcache简介 [转]
  2. C# HashTable 使用用法详解
  3. Facebook 如何管理150亿张照片
  4. idea debugger console 不见了--还原 console 图标
  5. C#快速找出磁盘内的所有文件
  6. 原价19万的美系插混,2年后落地只要11万~15万,微蓝6 PHEV为啥这么惨
  7. 新法案下 苹果或被禁止在设备上预装自家应用
  8. matlab基本使用指南
  9. 量化策略回测tdma
  10. 理解BERT Transformer:Attention is not all you need!
  11. access统计行数 vb_VB代码行数统计工具
  12. 记录-vant-DatetimePicker时间选择器,时间选择滚动区域消失。[class*=van-hairline]
  13. 计算机突然蓝屏重启,最近电脑经常蓝屏重启。
  14. d类数字功放芯片音质怎么样?
  15. CMMI——认证流程
  16. Ubuntu18.04中如何更换为清华的镜像源
  17. 监控工具——Metrics的Histogram可配置项
  18. android 手机映射软件 mac地址,android手机最好用的mac地址转换
  19. Vue2 SSR 的优化之旅
  20. shp文件批量定义投影坐标系python

热门文章

  1. js运动动画的八个知识点
  2. css的三种定位方式使用探讨
  3. php显示TABLE数据
  4. Android 手把手教您自定义ViewGroup
  5. HDFS文件系统基本文件命令、编程读写HDFS
  6. 类会默认产生的成员函数
  7. MySQL第12天:MySQL索引优化分析之性能优化案例实践
  8. Keil μVision 5版新建工程详细步骤(版本2)
  9. oracle:导入数据,遇到oracle错误 959
  10. python七:编码