TCP/IP网络编程-Linux

一、理解网络编程和套接字
1、概念理解
网络编程:编写程序使两台连网的计算机相互交换数据。
套接字(socket):网络数据传输用的软件设备
2、建立套接字
需要用到以下几个函数。
2.1 建立套接字 socket

	#include <sys/socket.h>
	int socket (int domain, int type, int protocol);
			参数解释:
			domain:协议族
				PF_INET    IPV4协议
				PF_INET6   IPV6协议
				PF_LOCAL   本地通信的UNIX协议
				PF_PACKET 底层套接字协议族
				PF_IPX     IPX Novell协议族
			type:数据传输类型信息
				SOCK_STREAM:面向连接的套接字
					特点: 
						1、传输过程中数据不会消失
						2、按序传输数据
						3、传输数据不存在数据边界
				SOCK_DGRM:面向消息的套接字
					特点:
						1、强调快速传输而非传输顺序
						2、传输的数据可能丢失而可能损毁
						3、传输的数据有数据边界
						4、限制每次传输的数据大小
			protocol:计算机键通信使用的协议信息
	-->成功时返回文件描述符,失败返回-1

2.2 绑定 bind函数,分配地址信息

	#include <sys/socket.h>
	int bind(int sockfd, struct sockaddr *addr,socklen_t adddrlen);
	int sockfd:套接字文件描述符
	解析 struct sockaddr *addr:
	struct sockaddr_in{
		sa_family_t sin_famile; // 地址族
		uint16_t sin_port; // 16位TCP/UDP 端口号
		struct in_addr sin_addr; //32位IP地址
		char sin_zero[8]; // 不适用
	};
	sin_famile:
		AF_INET 	IPv4网络协议中使用的地址族
		AF_INET6	IPv6网络协议中使用的地址族
		AF_LOCAL	本地通信中采用的UNIX协议的地址族
	struct in_addr {
		in_addr_t s_addr; // 32位IPv4地址
	};
	socklen_t adddrlen:第二个结构变量的长度
-->成功时返回0,失败时返回-1.

2.3 建立监听 listen

	#include <sys/socket.h>
	int liseten(int sockfd, int backlog);
	-->成功时返回0,失败时返回-1.

2.4 请求连接 accept

 #include <sys/socket.h>
 int accept(int sockfd,struct sockaddr *,socklen_t *addrlen);
 -->成功时返回文件描述符,失败时返回-1.

总结:
网络编程中接受连接请求的套接字过程,对于服务器端。
1、调用socket函数创建套接字
2、调用bind函数分配IP地址和端口
3、调用listen函数转为可接受请求状态
4、调用accept函数受理连接请求。

客服端:
1、调用socket函数和connect函数
2、与服务器端共同运行收发字符串的数据

客户端函数:

	#include <sys/socket.h>
	int connect(int sockfd,struct sockaddr *serv_addr,socklen_t addrlen);
-->成功时返回0,失败时返回-1.

二、套接字类型与协议设置
解析函数:

int socket (int domain, int type, int protocol);
参解:
domain:套接字中使用的协议族 (Protocol Family)
	PF_INET 							IPv4互联网协议族
	PF_INET6							IPv6互联网协议族
	PF_LOCAL							本地通信的UNIX协议族
	PF_PACKET							底层套接字协议族
	PF_IPX								IPX Novell协议族
type:套接字数据传输的类型
	类型1:面向连接的套接字 SOCK_STREAM
		特点:
			1、传输过程中数据不会消失
			2、按序传输数据
			3、传输的数据不存在数据便捷
	类型2:面向消息的套接字 SOCK_DGRAM
		特点:
			不可靠、不按序传递的、以数据的高速传输为目的的套接字
protocol:计算机间通信中的协议
	IPPROTO_TCP
	IPPROTO_UDP

三、地址族和数据序列
网络地址分为 A B C D 等
A类地址的首字节范围:0~127
B类地址的首字节范围:128~191
C类地址的首字节范围:192~223

字节序转换:
在填充结构体的数据,要将sockadr_in结构体前数据转换成网络字节序。

unsigned short htons(unsigned short);
unsigned short ntons(unsigned short);
unsigned short htonl(unsigned long);
unsigned short ntonl(unsigned long);
注:
1、htons中的h代表主机host字节序
2、htons中的n代表网络network字节序

点分十进制:
将字符串形式IP地址转换成32位整数型数据

#include <arpa/inet.h>
in_addr_t inet_addr(cconst char *string);
成功:返回32位大端序值
失败:返回INADDR_NONE

int inet_aton(const char *string, struct in_addr *addr);
string:含有需要转换的IP地址信息的字符串地址值
addr:将保存转换结果的in_addr结构体变量的地址值
成功:1
失败:0

将网络字节序整数型IP地址转换成字符串

#include <arpa/inet.h>
char *inet_ntoa(struct in_addr addr);
成功:返回字符的地址
失败:-1

持续更新中

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

可厉害的土豆

你的鼓励是我创作的源泉

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值