您的位置:首页 > 理论基础 > 计算机网络

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

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

一、Socket用到的数据结构

socket用到的.h文件

#include<sys/socket.h>定义与socket有关的宏和函数
#include<sys/types.h>定义新类型
#include</etc/services.h>不同的服务对应不同的端口
#include<netdb.h>端口号、协议号、IP地址、主机名转换函数
#include<arpa/inet.h>IP地址、网络顺序地址转换函数
#include<netinet/in.h>定义协议号、端口号等
#include<unistd.h>与POSIX和XOPEN标准相关的定义
#include<sys/wait.h>定义了wait和waitpid()等函数
#include<signal.h>定义了与信号有关的内容
#include<errno.h>定义错误类型
#include<stdlib.h>内存动态分配函数
#include<pthread.h>与线程有关的内容
#include<sys/time.h>与系统时钟有关的内容
#include<netinet/ip.h>定义IP协议相关的宏、结构等
#include<netinet/ip_icmp.h>定义ICMP协议相关的宏、结构等
(1) 存储地址和端口信息的sockaddrStruct 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)32位IPv4地址结构in_addrStruct 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_addr和sin_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”)注:1、inet_addr()返回的地址已经是按照网络字节顺序,不需要htonlinet_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(client.sin_addr);
注:inet_ntoa()de==的参数是struct in_addr,而不是unsigned long域名服务函数:grthostbyname()功能:实现域名转换位网络地址包含文件:#include<netdb.h>原型: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