套接字网络编程基础(二)

socket 套接字

套接字应用程序编程接口是网络应用程序通过网络协议栈进行通信时所使用的接口,即应用程序与协议栈软件之间的接口,简称套接字编程接口(Socket API)。它定义了应用程序与协议栈软件进行交互时可以使用的一组操作,决定了应用程序使用协议栈的方式、应用程序所能实现的功能、以及开发具有这些功能的程序的难度

这里写图片描述

套接字概念

  1. 从套接字所处的地位来讲,套接字上联应用进程,下联网络协议栈,是应用程序通过网络协议栈进行通信的接口,是应用程序与网络协议栈进行交互的接口
  2. 从实现的角度来讲,非常复杂。套接字是一个复杂的软件机构,包含了一定的数据结构,包含许多选项,由操作系统内核管理
  3. 从使用的角度来讲,非常简单。对于套接字的操作形成了一种网络应用程序的编程接口(API)

套接字特点

通信域

通信域:是一个计算机网络的范围,在这个范围中,所有的计算机使用同一种网络体系结构,使用同一种协议栈

套接字存在于通信域中,通信域是为了处理一般的进程通过套接字通信而引入的一种抽象概念,套接字通常只和同一域中的套接字交换数据。如果数据交换要穿越域的边界,就一定要执行某种解释程序。现在,仅仅针对Internet域,并且使用Internet协议簇来通信

套接字类型

数据报套接字

这里写图片描述
数据报套接字(Datagram Socket)提供无连接的不保证可靠的独立的数据报传输服务。在Internet通信域中,数据报套接字使用UDP数据报协议形成的进程间通路,具有UDP协议为上层所提供的服务的所有特点。

流式套接字

这里写图片描述
流式套接字(Stream Socket)提供双向的、有序的、无重复的、无记录边界的可靠的数据流传输服务。在Internet通信域中,流式套接字使用TCP协议形成的进程间通路,具有TCP协议为上层所提供的服务的所有特点,在使用流式套接字传输数据之前,必须在数据的发送端和接收端之间建立连接。

原始式套接字

原始式套接字(Raw Socket)允许对较低层次的协议,如IP、ICMP直接访问,用于检验新的协议的实现。

套接字使用的数据类型和相关问题

存储套接字地址结构体

  1. SOCKADDR Structure
struct sockaddr { 
   unsigned short sa_family; //Socket address family.
   char sa_data[14]; //Maximum size of all the different socket address structures.
};

VS文档介绍:

The SOCKADDR structure is used to store an Internet Protocol (IP) address for a machine participating in a Windows Sockets communication

要求

Header: winsock2.h

2.SOCKADDR Structure

struct sockaddr_in{ 
   short sin_family; //Address family (must be AF_INET).
   unsigned short sin_port; //IP port.
   struct in_addr sin_addr; //IP address.
   char sin_zero[8]; //Padding to make structure the same size as SOCKADDR.
};

VS文档介绍:

This is the form of the SOCKADDR structure specific to the Internet address family and can be cast to SOCKADDR.

The IP address component of this structure is of type IN_ADDR. The IN_ADDR structure is defined in Windows Sockets header file WINSOCK.H as follows:

struct in_addr {
	union {
			struct{
					unsigned char s_b1,
					s_b2,
					s_b3,
					s_b4;
			} S_un_b;
			struct {
					unsigned short s_w1,
					s_w2;
			} S_un_w;
			unsigned long S_addr;
	} S_un;
};

要求:

Header: winsock2.h

本机字节顺序和网络字节顺序

网络字节顺序是TCP/IP规定好的一种数据表示格式,它与具体的CPU类型、操作系统无关,从而可以保证数据在不同主机之间传输时能被正确解释。网络字节顺序采用低位字节排放在内存的低地址端,高位字节排放在内存的高地址端排序方式

本机字节顺序具体计算机中的多字节数据存储顺序

网络应用程序要在不同的计算机中运行,本机字节顺序是不同的,但是,网络字节顺序是相同的。所以,应用程序在编程的时候,在把IP地址和端口号装入套接字的时候,应当把它们从本机字节顺序转换为网络字节顺序;相反,在本机输出时,应将它们从网络字节顺序转换为本机字节顺序

相关转化函数

htons() 短整数本机顺序转换为网络顺序,用于端口号
htonl() 长整数本机顺序转换为网络顺序,用于IP地址
ntohs()短整数网络顺序转换为本机顺序,用于端口号
ntohl() 长整数网络顺序转化为本机顺序,用于IP地址

这四个函数将被转换的数值作为函数的参数,函数返回值是转换后的结果

点分十进制的IP地址转换

在因特网中,IP地址常常用点分十进制的表示方法,但在套接字中,IP地址是无符号的长整型数,套接字编程接口设置了两个函数,专门用于两种形式的IP地址的转换

unsigned long inet_addr(const char* cp)

入口参数cp:点分十进制形式的IP地址
返回值: 网络字节顺序的IP地址,是无符号的长整数

char * inet_ntoa(struct in_addr in)//结构体转化为IP地址

入口参数in:包含长整型IP地址的 in_addr 结构变量
返回值: 指向点分十进制IP地址的字符串的指针

域名服务
struct hostent* gethostbyname(const char * name)

入口参数:是站点的主机域名字符串,
返回值: 是指向hostent 结构的指针

hostent结构包含主机名、主机别名数组、返回地址的类型(一般是AF-INET)、地址长度的字节数、已符合网络字节顺序的主机网络地址等

//以上内容大部分摘自《网络编程实用教程(第三版)》 编者 段利国 刘金江 倪天伟 叶树华
//侵权必删
//仅供参考
//windows网络编程

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值