Linux网络编程——TCP编程基础知识点总结

关于网络编程的基础知识,我再之前的博客里面有总结,感兴趣的可以看一下:网络编程——基础知识总结
TCP传输层协议(Transmission Control Protocol)是一种面向连接、可靠DE ,基于字节流的传输层通信协议
在七层模型中,它属于传输层,建立主机到端口之间的连接。

在这里插入图片描述

TCP编程步骤

服务器端一般步骤

1、 创建一个socket,用函数socket();
2、 设置socket属性,用函数setsockopt(); * 可选
3、 绑定IP地址、端口等信息到socket上,用函数bind();
4、 开启监听,用函数listen();
5、 接收客户端上来的连接,用函数accept();
6、 收发数据,用函数send()和recv(),者read()和write();
7、 关闭网络连接;
8、 关闭监听;

客户端一般步骤

1、 创建一个socket,用函数socket();
2、 设置socket属性,用函数setsockopt();* 可选
3、 绑定IP地址、端口等信息到socket上,用函数bind();* 可选
4、 设置要连接的对方的IP地址和端口等属性;
5、 连接服务器,用函数connect();
6、 收发数据,用函数send()和recv(),或者read()和write();
7、 关闭网络连接;

socket中的函数

socket函数

int socket(int domin int type int protocol);

参数:
①domin
在这里插入图片描述
②type
SOCK_STREAM:流式套接字【唯一对应于TCP】
SOCK_DGRAM:数据报套接字【唯一对应着UDP】
SOCK_RAM:原始套接字
③protocol
一般填0,原始套接字编程是需填充

返回值
RETURN VALUE
on success,a file descriptor for the new socket is returned.On error,-1 is returned,and errno is set appropriately
成功时返回文件描述符,出错时返回-1.

bind()函数

用于将socket描述符与本机上的一个端口相关联(仅仅用于服务器)

int bind(int sockefd, const strict sockaddr*addr, sockelen_t addrlen);

参数:
sockfd:是一个socket描述符通过socket函数拿到fd
addr:struct sockaddr的结构体变量的地址
addrlen=sizeof(struct aockaddr)

struct sockaddr{
sa_family;
char sa_data(14);
}

返回值:成功=0;失败=-1;erno=错误号
可以用下面的赋值自动获取本机IP地址和随机获取一个没有被占用的端口号:
addr.sin_port=0/系统随机选择一个未被使用的端口号/
addr.sin_.s_addr=INADR_ANY;/填入本机IP地址/

Connect函数

与远端服务器建立一个TCP连接 (用于客户端)

int connect(int sockfd, struct sockaddr *serv_addr, int addrlen);

Sockfd是目的服务器的sockt描述符
serv_addr是包含目的机IP地址和端口号的指针。
返回:成功=0;失败=-1,errno=错误号。

listen函数

监听是否有服务请求,用于bind()后

int listen(int sockefd, int backlog);

参数:
sockfd:通过socket()函数拿到fd
backlog:一般填5;同时允许几路客户端和服务器进行连接的过程,测试得知,ARM最大为8
内核中服务器的套接字fd会维护两个链表(数量=2*backlog+1)
已经建立好的连接的客户端链表(已经完成3次握手飞配好了newfd)
返回值:
成功:0;出错:1

accept函数

阻塞等待客户端连接请求

int accept(int sockefd, struct sockaddr *addr,sockelen_t*addrlen);

参数:
scokefd:经过前面的socket(),并通过bind(),listen()设置的fd
addr:struct sockaddr的结构体变量的地址
addrlen:地址长度
返回值:
成功:返回已经建立好连接的newfd
失败:-1

read()、write()函数

ssize_t read(int fd, void *buf, size_t count);
ssize_t write(int fd, const void *buf, size_t count);

read():

  • read函数是负责从fd中读取内容

  • 当读取成功时,read返回实际所读的字节数

  • 如果返回的值是0表示已经读到文件的结束,小于0则表示出现了错误

  • 如果错误为EINTR说明是由终端引起的;如果是由ECONNREST表示网络连接出了问题

  • write():

  • write函数将buf中的nbytes字节内容写入文件描述符fd

  • 成功时返回写的字节数,失败时返回-1,并设置errno变量

  • 在网络程序中,当我们向套接字文件描述符写时存在两种可能:

    • 1、write的返回值>0,表示写了部分或者全部的数据
    • 2、返回的值<0,此时出现了错误
  • 如果错误为EINTR表示在写的时候出现了中断错误;如果为EPIPE表示网络连接出现问题(对方已经关闭了连接)

Send函数

在连接(TCP)的socket方式下发送信息
int send(int sockfd, const void *msg, int len, int flags);
Sockfd是用来传输数据的socket描述符
msg是一个指向要发送数据的指针。
Len是以字节为单位的数据的长度。
flags一般情况下置为0。

recv函数

在连接(TCP)的socket方式下接收数据
int recv(int sockfd,void *buf,int len,unsigned int flags);
Sockfd是接受数据的socket描述符;
buf 是存放接收数据的缓冲区;
len是缓冲的长度。
Flags也被置为0。
返回:实际上接收的字节数,如果连接中止,返回0,。出现错误时,返回-1并置相应的errno值。

sendto函数

在在无连接(UDP)的socket方式下发送数据
int sendto(int sockfd, const void *msg,int len,unsigned int flags,const struct sockaddr *to, int tolen);
to表示目地机的IP地址和端口号信息
tolen=sizeof (struct sockaddr)。
返回:实际发送的数据字节长度或在出现发送错误时返回-1。

Recvfrom函数

在无连接(UDP)的socket方式下接收数据
int recvfrom(int sockfd,void *buf,int len,unsigned int flags,struct sockaddr *from,int *fromlen);
from 保存源机的IP地址及端口号。
fromlen=sizeof(struct sockaddr)。
返回:实际存入from中的数据字节数。当出现错误时返回-1,并置相应的errno。

close函数

释放socket,停止任何数据操作
close(sockfd);

shutdown函数

单向关闭连接
int shutdown(int sockfd,int how);
how可以设为下列值:
·0-------不允许继续接收数据
·1-------不允许继续发送数据
·2-------不允许继续发送和接收数据,均为允许则调用close ()
shutdown在操作成功时返回0,在出现错误时返回-1(并置相应errno)。

gethostbyname函数

域名和IP地址的转换
struct hostent *gethostbyname(const char *name);

inet_pton函数

将点分十进制串转换成网络字节序二进制值,此函数对IPv4地址和IPv6地址都能处理。
int inet_pton(int family,const char * strptr,void * addrptr);
第一个参数可以是AF_INET或AF_INET6:第二个参数是一个指向点分十进制串的指针:第三个参数是一个指向转换后的网络字节序的二进制值的指针。
返回:1—成功0—输入不是有效的表达格式-1—失败

inet_ntop函数

和inet_pton函数正好相反,inet_ntop函数是将网络字节序二进制值转换成点分十进制串。
const char * inet_ntop(int family,const void * addrptr,char * strptr,size_t len);
第一个参数可以是AF_INET或AF_INET6:第二个参数是一个指向网络字节序的二进制值的指针;第三个参数是一个指向转换后的点分十进制串的指针;第四个参数是目标的大小,以免函数溢出其调用者的缓冲区。
返回:指向结果的指针—成功NULL—失败

发布了28 篇原创文章 · 获赞 5 · 访问量 3717

猜你喜欢

转载自blog.csdn.net/qq_42711899/article/details/104422740