IP地址的作用时标示计算机的网卡地址,每台计算机都有一个IP地址;端口,是指计算机中为了标示在计算机中访问网络的不同程序而设的编号,并不是网卡接线的端口,而是不同程序的逻辑编号,并不是实际存在的;域名,是用来代替IP地址来标示计算机的一种直观名称,例如百度网站的IP地址是202.108.22.43,这个IP地址没有任何逻辑含义,不便记忆,而www.baidu.com是一个便于记忆的名称,用于代替这个IP地址;套接字的本意是插座,在网络中用来描述计算机中不同程序与其他计算机程序的通信方式;常用的套接字类型有3种:(1)流套接字(SOCK——STREAM):使用了面向连接的可靠的数据通信方式,即TCP协议;(2)数据报套接字(Raw Sockets):使用了不面向连接的数据传输方式,即UDP;(3)原始套接字(SOCK——RAW):没有经过处理的IP数据包,可以根据自己程序的要求进行封装;网络协议是指不同的计算机、不同的操作系统在进行网络通信时的统一约定;网络服务指的是网络上的计算机通过运行程序为其他的计算机提供信息或运算的功能。
     套接字相关的数据类型:sockaddr和sockaddr_in;sockaddr用来保存一个套接字,定义如下:
struct   sockaddr
{
   unsigned short int sa_family;  //指定通信地址类型,如果是TCP/IP通信,则值为AF_inet
   char sa_data[14];      //最多用14个字符长度,用来保存IP地址和端口信息
};
sockaddr_in的功能与socdaddr相同,也是用来保存一个套接字的信息,不同的是将IP地址与端口分开为不同的成员,定义如下:
struct sockaddr_in
{
    unsigned short int sin_family;//指定通信地址类型
    uint16_t sin_port; //套接字使用的端口号
    struct in_addr sin_addr;//需要访问的IP地址
    unsigned char sin_zero[8];//未使用的字段,填充为0
};
在这一结构中,in_addr也是一个结构体,定义如下,用于保存一个IP地址:
struct in_addr
{
  uint32_t  s_addt;
};
用域名取得主机的IP地址:struct hostent *gethostbyname(const char *name);
结构体hostent的定义如下:
struct hostent
{
  char *h_name;//正式的主机名称
  char **h_aliases;//这个主机的别名
  int  h_addrtype;//主机名的类型
  int  h_length;//地址的长度
  char **h_addr_list;//从域名服务器取得的主机地址
};
用IP地址返回域名:struct hostent *gethostbyaddr(const void *addr,socklen_t len,int type);
由协议名取的协议数据:struct protoent *getprotobyname(char *name);
结构体protoent定义如下:
struct protoent
{
   char *p_name;//协议的名称
   char **p_aliases;//协议的别名
   int p_proto;//协议的序号
};
由协议编号取得协议信息:struct protoent *getprotobynumber(int proto);
取得系统支持的所有协议:struct protoent *getprotoent(void);
取得系统支持的网络服务:struct servent *getservent(void);
结构体servent定义如下:
struct servent
{
   char *s_name;//这个服务的名称
   char **s_aliases;//这个服务可能的别名
   int s_port;//这个服务可能的端口
   char *s_proto;//这个服务可能使用的协议
};
用名称取得系统所支持的服务:struct servent *getservbyname(char *name,char *proto);//name:服务器名称,proto服务器所使用的协议;
由端口取得服务名称:struct servent *getservbyport(int port,char *proto)//port是端口的编号,需要注意的是这个端口号需要用htons()函数进行转换,proto表示一个协议的字符串;
将网络地址转换成长整型:long inet_addr(char *cp)//cp表示一个IP地址字符串;将长整型IP地址转换成网络地址即大小端模式转换:char *inet_ntoa(struct in_addr in);
uint32_t htonl(uint32_t hostlong)//将计算机中的32位长整型数转换成网络字符顺序的32位长整型数;
uint16_t htons(uint16_t hostshort)//将计算机中的16位整型数转换成网络字符顺序的16位整型数;
uint32_t ntohl(uint32_t netlong)//将网络字符顺序的32位长整型数转换成计算机中的32位长整型数;
uint16_t ntohs(uint16_t netshort)//将网络字符顺序的16位整型数转换成计算机中的16位整型数;
herror函数显示错误:void herror(const char *S)//s是一个字符串,函数先输出这个字符串,然后输出错误信息.
创建套接字函数:int socket(int domain,int type,int protocol),参数domain用于指定创建套接字所使用的协议族(可取AF_UNIX,AF_INET,AF_INTE6),参数type指定套接字的类型(可取SOCK_STREAM,SOCK_DGRAM,SOCK_RAW)参数protocol通常设置为0;在指定套接字上创建链接函数:int connect(int sockfd,const struct sockaddr *serv_addr,socklen_t addrlen),参数sockfd是一个由函数socket创建的套接字,参数serv_addr是一个地址结构,指定服务器的IP地址和端口号,参数addrlen为参数serv_addr的长度;将一个套接字和某个端口绑定在一起的函数:int bind(int sockfd,struct sockaddr *my_addr,socklen_t addrlen)一般只有服务器端的程序调用,参数my_addr指定了sockfd将绑定到的本地地址,可以将参数my_addr的sin_addr设置为INADDR_ANY而不是某个确定IP地址就可以绑定到任何网络接口;把套接字转化为被动监听函数:int listen(int s,int backlog),参数s为套接字,参数backlog指定链接请求队列的最大长度;接收连接请求函数:int accept(int s,struct sockaddr *addr,socklen_t *addrlen)参数s是由函数socket创建,经函数bind绑定到本地某一端口上,然后通过函数listen转化而来的监听套接字,参数addr用来保存发起连接请求的主机的地址和端口,参数addrlen是addr所指向的结构体的大小;在TCP套接字上发送数据函数:ssize_t send(int s,const void *msg,size_t len,int flags)函数只能对处于连接状态的套接字使用,参数s为已建立好连接的套接字描述符,即accept函数的返回值,参数msg指向存放待发送数据的缓冲区,参数len为待发送数据的长度,参数flags为控制选项,一般设置为0;在TCP套接字上接收数据函数:ssize_t recv(int s,void *buf,size_t len,int flags)函数recv从参数s所指定的套接字描述符(必须是面向连接的套接字)上接收数据并保存到参数buf所指定的缓冲区,参数len则为缓冲区长度,参数flags为控制选项,一般设置为0;在UCP套接字上发送数据函数:ssize_t sendto(int s,const void *msg,size_t len,int flags,const struct sockaddr *to,socklen_t tolen)函数功能与函数send类似,但函数sendto不需要套接字处于连接状态,所以该函数通常用来发送UDP数据,同时因为是无连接的套接字,在使用sendto时需要指定数据的目的地址,参数msg指向待发送数据的缓冲区,参数len指定了待发送数据的长度,参数flags是控制选项,含义与send函数中的一致,参数to用于指定目的地址,目的地址的长度由tolen指定;在UDP套接字上接收数据函数:ssize_t recvfrom(int s ,void *buf,size_t len,int flags,struct sockaddr *from,socklen_t *fromlen)与函数recv功能类似,只是函数recv只能用于面向连接的套接字,而函数recvfrom没有此限制,莪可以用于从无连接的套接字上接收数据,参数buf指向接收缓冲区,参数len指定了缓冲区的大小,参数flags是控制选项,含义与recv中的一致,如果参数from非空,且该套接字不是面向连接的,则函数recvfrom返回时,参数from中将保存数据的源地址,参数fromlen在调用recvfrom前为参数from的长度,调用recvfrom后将保存from的实际大小;关闭套接字函数:int close(int fd)参数fd为一个套接字描述符;函数:int shutdown(int s,int how)功能与close类似,但是shutdown功能更强大,它允许对套接字进行单向关闭或全部禁止,参数s为待关闭的套接字描述符,参数how指定了关闭的方式;inet系列函数用于网络地址的格式转换;获取和设置套接字属性函数:int getsockopt(int s,int level,int optname,void *optval,cocklen_t *optlen);int setsockopt(int s,int level,int optname,const void *optval,socklen_t optlen);参数s为一个套接字,参数level是进行套接字选项操作的层次,参数optname是套接字选项名称,对于函数getsockopt,参数opval用来存放获得的套接字选项,参数optlen在调用函数前其值为optval指向的空间的大小,调用完后则其值为参数optval所保存的结果的实际大小,对于函数setsockopt,参数optval是待设置的套接字选项的值,参数optlen是选项的长度;多路复用函数:int select(int n,fd_set *readfds,fd_set *writefds,fd_set *exceptfds,struct timeval *timeout)参数n是需要监视的文件描述符数,参数readfds指定需要监视的可读文件描述符集合,参数writefds指定需要监视的可写文件描述符集合,参数exceptfds指定需要监视的异常文件描述符的集合,参数timeout指定了阻塞的时间;
     网络编程中有很多新的概念和协议,要好好理解,还有一些系统定义的数据类型,要了解这些数据类型,方便使用,其次是要掌握一些常用函数的功能及使用方法,网络编程我刚刚开始接触,感觉跟前面有很大区别,必须进一步学习才能有所提高。

socket网络编程常用的结构及函数小结相关推荐

  1. socket网络编程常用C语言api函数(Linux)

    参考<Linux高性能服务器编程> 网络编程常用函数 字节序 ip转换 地址结构体 socket相关函数 数据读写 获取地址信息 获取或者设置套接字属性 通过域名或地址获取主机信息 字节序 ...

  2. Linux socket 网络编程常用函数总结

    1.字节序函数 #include <netinet.h> uint16_t htons(uint16_t host16bitvalue); uint32_t htonl(uint32_t  ...

  3. Linux socket 网络编程 常用头文件

    一 三种类型的套接字: 1.流式套接字(SOCKET_STREAM) 提供面向连接的可靠的数据传输服务.数据被看作是字节流,无长度限制.例如FTP协议就采用这种. 2.数据报式套接字(SOCKET_D ...

  4. 视频教程-C++socket网络编程--http服务器(支持php)实战教学视频-C/C++

    C++socket网络编程--http服务器(支持php)实战教学视频 夏曹俊:南京捷帝科技有限公司创始人,南京大学计算机硕士毕业,有15年c++跨平台项目研发的经验,领导开发过大量的c++虚拟仿真, ...

  5. C++socket网络编程大全实战http服务器(支持php)视频课程-夏曹俊-专题视频课程

    C++socket网络编程大全实战http服务器(支持php)视频课程-16782人已学习 课程介绍         C++socket网络编程大全实战http服务器(支持php)视频培训教程概况:本 ...

  6. socket网络编程——套接字地址结构

    声明:此博客是本人根据老师课件总结的,如有抄袭行为,本人会即刻删除. 1.主机字节序列和网络字节序列 主机字节序列分为大端字节序和小端字节序,不同的主机采用的字节序列可能不同.大端字节序是指一个整数的 ...

  7. Linux Kernel TCP/IP Stack — Socket Layer — TCP/UDP Socket 网络编程

    目录 文章目录 目录 TCP/UDP Socket 逻辑架构 创建 Socket 绑定 Socket 请求建立 Socket 连接 监听 Socket 接受请求 关闭连接 数据的发送和接收 send ...

  8. 【linux高级程序设计】(第十三章)Linux Socket网络编程基础 2

    BSD Socket网络编程API 创建socket对象 int socket (int __domain, int __type, int __protocol) :成功返回socket文件描述符, ...

  9. 1.socket网络编程

    socket网络编程总结(Linux+Windows) 理解为:套接字通信,网络通信 1.概念 1.1 局域网和广域网 局域网:局域网将一定区域内的各种计算机.外部设备和数据库连接起来形成计算机通信的 ...

最新文章

  1. 一名大神的github
  2. C++(五)——运算符重载
  3. JS实现全选、反选、不选
  4. NC14250 MMSet2
  5. 斗地主AI算法——第一章の业务逻辑
  6. 装完金蝶电脑无限重启_金蝶财务软件快捷键大全,提高工作效率!
  7. Dubbo关于timeout等相关配置的优先级
  8. python之解决Cannot uninstall ‘certifi‘问题
  9. 快速计算子网掩码和主机块
  10. 可以在python3下面用的pyh
  11. 德国计算机博士怎样,2020年德国IT博士offer什么时候发
  12. DNS服务器配置图解过程(1)
  13. 关于主机的思维导图_「停课不停学」思维导图—初中数学全部知识点总结,高清可打印...
  14. 数据元素之间的逻辑关系的整体称为数据的逻辑结构
  15. 如何培养你自己独特的领导风格?
  16. felix李_和felix相爱相杀的那些年
  17. Netty内置处理器整理
  18. 【译】The Science of Scientific Writing
  19. 学习VTK9笔记(三)打开stl文件
  20. 网上购车平台买车,购车门槛低!

热门文章

  1. 计算机二级Python真题(七)
  2. Linux 服务器自动连接校园网,selenium + geckodriver + firefox浏览器
  3. 网络安全工程师的初学路径
  4. 什么是IO多路复用,理解IO多路复用
  5. vue v-if : TypeError: Cannot read property 'length' of undefined
  6. vmvare workstation 15Pro密钥
  7. 唠一唠 消息可靠性保障消息幂等性处理 (RabbitMQ实际应用问题)
  8. QT -- TcpSocket实例,使用Qt中的tcp通信协议,构建客户端和服务端,实现局域网通信软件功能
  9. Java Agent入门教程
  10. Comparator、compare、compareTo