Linux-网络编程套接字

理解源IP地址和目的IP地址
在IP数据报头部中,有两个IP地址,分别叫做源IP地址和目的IP地址。
认识端口号
端口号是传输层协议的内容
端口号是一个2字节十六位的整数
端口号用来标识一个进程,告诉操作系统,当前的这个数据要交给哪一个进程来处理;
IP地址+端口号能被标识网络上的某一台主机的某一个进程
一个端口号只能被一个进程占用
一个进程可以绑定多个端口号,但是一个端口号不能被多个进程绑定
理解源端口号和目的端口号
传输层协议的数据段中有两个端口号,分别叫做源端口号和目的端口号,就是在描述数据是谁的,要发给谁
TCP协议
传输层协议
有链接
可靠传输
面向字节流
认识UDP协议
传输层协议
无连接
不可靠传输
面向数据报
套接字
在这里我们就可以知道网络端口号加上IP地址就构成了我们所说的套接字
网络字节序
我们已经知道,内存中的多字节数据相对于内存地址有大端和小端之分,磁盘文件中的多字节数据相对于文件中的偏移地址也有大端小端之分,那么如何定义网络数据流的地址
1、发送主机通常将发送缓冲区中的数据按内存地址从低到高的顺序发出。
2、接受主机把从网络上接到的字节一次保存在接受缓冲区中,也是按照内存地址从低到高的顺序保存;
3、因此,网络数据流地址应该是这样规定的:先发出的数据是地地址,后发出的数据是搞地质;
4、TCP/IP协议规定,网络数据流应采用大端字节序,即地地址高字节
5、不管这台主机是大端机还是小端机,都会按照这个TCP/IP规定的网络字节序来发送/接收数据
6、如果当前发送主机是小端,就需要先将数据转化成大端;否则就忽略。直接发送就可以了
为了使网络程序具有可移植性,使同样的C代码在大端和小端计算机上编译后都能正常运行,可以调用一下库函数做网络字节序和主机字节序的转换。

#include <arpa/inet.h>
uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);

1、h表示Host,n表示Network,l表示32位长整数,s表示16位短整数
2、例如htonl表示将32位的长整数从主机字节序转换为网络字节序,例如将IP地址转换后准备发送
3、如果主机是小端字节序,这些函数将参数做相应的大小端转换后返回
4、如果主机是大端字节序,这些函数不做转换,将参数直接返回
5、如果主机是大端字节序,这些函数不做转换,将参数直接返回

socket编程接口
1、创建socket文件描述符(TCP/UDP,客户端+服务器)

int socket(int domain,int type,int protocol);

2、绑定端口号(TCP/USP,服务器)

int bind(int soket,const struct sckaddr *address,socklen_t address_len);

3、开始监听socket(TCP,服务器)

int listen(int socket,int backlog);

4、接受请求(TCP,服务器)

int accept(int socket,struct sockaddress,socklen_t *address_len);

5、建立连接(TCP,客户端)

int connect(int sockfd,const struct sockaddr * addr,socklen_t addrlen);

猜你喜欢

转载自blog.csdn.net/yummy_alice/article/details/80854246