27TCP

匿名 (未验证) 提交于 2019-12-03 00:32:02

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地址,不知道端口号也无法进行通信。

27TCP

原文:https://www.cnblogs.com/gd-luojialin/p/9216036.html

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!