TCP/IP编程学习笔记(1)

使用TCP/IP协议的应用程序通常采用应用编程接口:UNIX  BSD的套接字(socket)。socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/IO、打开、关闭)。

一、Socket用到的数据结构

socket用到的.h文件

#include定义与socket有关的宏和函数
#include定义新类型
#include不同的服务对应不同的端口
#include端口号、协议号、IP地址、主机名转换函数
#includeIP地址、网络顺序地址转换函数
#include定义协议号、端口号等
#include与POSIX和XOPEN标准相关的定义
#include定义了wait和waitpid()等函数
#include定义了与信号有关的内容
#include定义错误类型
#include内存动态分配函数
#include与线程有关的内容
#include与系统时钟有关的内容
#include定义IP协议相关的宏、结构等
#include定义ICMP协议相关的宏、结构等

(1) 存储地址和端口信息的sockaddr

Struct sockaddr
{unsigned short sa_family;/*Internet地址簇,AF_INRT*/
Char sa_data[14];/*目的地址和端口信息*/
};

(2) INET协议簇地址结构socketaddr_in,便于访问

Struct sockaddr_in{
unsigned short sin_family;/*取AF_INRT*/
unsigned short sin_port;/*端口号,网络字节顺序*/
struct in_addr sin_addr;/*IP地址,网络字节顺序*/
unsigned char sin_zero[8];/*使用bzero()或memset()全部置0*/
};

(3)32IPv4地址结构in_addr

Struct in_addr{unsigned long s_addr;};

地址转换函数:

htons()--- host to network short
htonl()--- host to network long
ntohs()--- network to host short
ntohl()--- networ to khost long

sin_addrsin_port需要转换为网络字节顺序,sin_family不需转换,只被内核调用,不发送到网络,可以时本机字节顺序。

初始化一个AF_INET地址:

struct sockaddr_in adr_inet;//定义变量adr_inet
Int adr_len;
memset(&adr_inet,0,sizeof(adr_inet));//string.h中将地址结构adr_inet清0
adr_inet.sin_family=AF_INET;
adr_inet.sin_port=htons(0);//自动选择合适的端口号
adr_inet.sin_addr.s_addr=htonl(INADDR_ANY);//自动填写所运行机器的IP地址
adr_len=sizeof(adr_inet);

处理IP地址:

函数:inet_addr()返回的地址已经是按照网络字节顺序,不需要htonl

原型:unsigned long int inet_addr(char *src)

例:struct sockaddr_in ina;

Ina.sin_addr.s_addr=inet_addr(162.105.32.1)

注:1inet_addr()返回的地址已经是按照网络字节顺序,不需要htonl

inet_addr()发生错误时返回-1,编程时需进行错误检查

如:
if((ina.sin_addr.s_addr=inet_addr(“162.105.32.1”))<0)
Cout<<”Address Error!”;

网络地址转换未点分十进制格式

函数:inet_ntoa()

原型:char *inet_ntoa(struct in_addr in)

例:
struct sockaddr_in client;
Coun<<”you got a connection from \n”
<

注:inet_ntoa()de==的参数是struct in_addr,而不是unsigned long

域名服务

函数:grthostbyname()

功能:实现域名转换位网络地址

包含文件:#include

原型:struct hostent *gethostbyname(char *name)

数据结构:

struct hostent{
Char *h_name;//主机名
Char **h_aliases;//主机别名数组
Int h_addrtype;//返回地址类型,常为AF_INET
Int h_length;//地址长度,用字节数表示
Char  **h_addr_list;//主机网络地址数组
};
#define h_addr h_addr_list[0]//网络字节顺序的IP地址

例:
struct hostent *he;
struct sockaddr_in server;
He=gethostbyname(“www.math.nankai.edu.cn”);
Server.sin_addr=*((struct in_addr*)he->h_addr);



 
   





你可能感兴趣的:(TCP/IP,socket)