TCP通信流程步骤:
服务端: 等待(被动)接收发送
客户端:主动发送接收
TCP通信流程图:


什么是套接字?
注意:IP地址决定往哪个主机发送,端口决定哪个程序接受
优点:
1.像操作文件描述符一样操作套接字
2.双向通信接口,起源于管道
3.比管道功能更强,应用更广泛
4.支持 read , write 等操作用于收发数据
服务端具体函数解析:
创建套接字
#include<sys/socket.h>
参数:
第一参数参考值:
socket 创建套接字 --- domain
第二参数参考值:
socket 创建套接字 --- type
注意:
套接字 SOCKET 类型
SOCK_STREAM
SOCK_DGRAM
数据报套接字:使用 UDP 协议。 提供无连接的,无序的,不保证可靠性的数据通信流。如 tftp, bootp 等
SOCK_RAW
原始流套接字:收发原始数据包,应用于底层协议开发,进行底层操作
只有 root 用户才有权限创建这个 socket
第三参数参考值:
socket 创建套接字 --- protocol
<netinet/in.h>
IPPROTO_RAW: RAW 只能发送包,且需要自己填写IP头,计算校验和
绑定套接字
struct sockaddr
{
}
对于不同的协议族,协议地址 sa_data[14] 有不同的描述方式
AF_INET 协议族的协议地址
{
}
注意:一般定义sockaddr_in,填写信息,再将sockaddr_in转成sockaddr再使用在bind函数。
IP地址转换
#include<arpa/inet.h>
字符串 IP 转 整数 IP
字符串 IP 转 整数 IP
整数 IP 转 字符串 IP
字节序转换
主机字节序:
主机序转网络序
网络序转主机序
监听端口
连接处理
阻塞,等待接收客户端连接申请
接收成功,则创建套接字,用于发送消息给客户端
sockfd设置为非阻塞的情况,未接收到连接申请,则返回错误
关闭套接字
同文件操作
关闭时,只是将套接字访问计数器 -1, 计数器为0时真正关闭
用于创建子进程进行并发管理
服务端具体函数解析:
-----------------------创建套接字与服务端一样,参考上面--------------
发送数据
flags 标志一般填0, 特殊情况下用法如下
不通过网关发送数据,只发送到同一子网计算机
MSG_DONTWAIT
使用非阻塞操作,阻塞则返回EAGAIN错误
MSG_EOR
结束记录(SOCK_SEQPACKET 时使用)
MSG_MORE
还有后续数据要发送,效果相当于套接字使用了TCP_CORK属性。通知内核,这个帧的数据还没发完,后续数据发送后,这个数据才能发送出去。
发送带外数据。提高优先级,先于其他数据进行发送
接收消息
flags标志一般填0, 特殊情况下用法如下
MSG_DONTWAIT
非阻塞操作,阻塞则返回EAGAIN错误
MSG_OOB
接收带外数据
MSG_PEEK
只查看消息,不从缓冲区删除数据
MSG_TRUNC
返回包的真实长度(只用于流套接字)
MSG_WAITALL
等待接收到的数据长度为len后才返回
例子:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<unistd.h>
void Tcp_server()
{
iRet = listen(fd, 1);
}
void Tcp_client()
{
}
int main(int argc, char** argv)
{
}
TCP搜索端口:

搜素端口与ping的区别:
ping只能确认某IP地址是否存在,当知道IP地址,不知道端口号也无法进行通信。
原文:https://www.cnblogs.com/gd-luojialin/p/9216036.html