TCP/IP编程学习笔记(1)
2018-03-07 21:05
78 查看
使用TCP/IP协议的应用程序通常采用应用编程接口:UNIX BSD的套接字(socket)。socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO、打开、关闭)。
{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;};地址转换函数:
sin_addr和sin_port需要转换为网络字节顺序,sin_family不需转换,只被内核调用,不发送到网络,可以时本机字节顺序。
例:
一、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);
相关文章推荐
- 新闻速读 > Ripple20 漏洞影响数亿设备
- java-模拟tomcat服务器
- Linux socket 初步
- 如何重装TCP/IP协议
- java socket 注意的地方
- java nio select 实现 httpclient
- java socket 注意的地方
- java nio select 实现 httpclient
- C#基于socket模拟http请求的方法
- 简单的Ruby中的Socket编程教程
- c#使用Socket发送HTTP/HTTPS请求的实现代码
- Socket不能选择本地IP连接问题如何解决
- C#之Socket操作类实例解析
- 使用C#来编写一个异步的Socket服务器
- C# Socket 发送&接收&返回 简单应用实例
- node.js 用socket实现聊天的示例代码
- C#使用Socket快速判断数据库连接是否正常的方法
- 基于c#用Socket做一个局域网聊天工具
- C# Socket的TCP通讯的实例代码