当前位置: 首页> 汽车> 维修 > 产品宣传片公司_四川省重庆市_品牌广告视频_网站提交收录软件

产品宣传片公司_四川省重庆市_品牌广告视频_网站提交收录软件

时间:2025/7/12 14:24:39来源:https://blog.csdn.net/m0_67638362/article/details/143952617 浏览次数: 0次
产品宣传片公司_四川省重庆市_品牌广告视频_网站提交收录软件

一:TCP协议

1.1:基本介绍

TCP是面向连接的,可靠的传输层协议(数据无误,数据无丢失,数据无失序,数据无重复)

适用情况:1、适合于对传输质量要求较高,以及传输大量数据的通信。2、在需要可靠数据传输的场合,通常使用TCP协议3、MSN/QQ等即时通讯软件的用户登录账户管理相关的功能通常采用TCP协议缺点:发送量较大,效率低

1.2:套接字类型

1.2.1:流式套接字:TCP
1.2.2:数据报套接字:UDP
1.2.3:原始套接字

1.3:端口号与字节序

  • TCP端口号与UDP端口号独立
  • 端口用两个字节来表示 

2:字节序

  1. 字节序是指不同类型的cpu主机,内存存储 "多字节整数" 序列的方式
  2. 浮点类型,字符类型,字符串没有字节序。
  3. 小端序(little-endian) - 低序字节存储在低地址 (主机字节序)
  4. 大端序(big-endian) - 高序字节存储在低地址 (网络字节序)

2.1:主机字节序转为网络字节序

u_long htonl(u_long hostlong);u_short htons(u_short short);//掌握这个
2.2:网络字节序转为主机字节序
u_long ntohl(u_long hostlong);u_short ntohs(u_short short);
2.3:IP地址的转换
typedef uint32_t in_addr_t;
struct in_addr
{in_addr_t s_addr;
};in_addr_t inet_addr(const char *ip);//从人看的IP地址转换为机器使用的32位无符号整数
char *inet_ntoa(struct in_addr in);//从机器到人

二: TCP编写流程

服务器:1.创建流式套接字(socket())------------------------>  有手机2.指定本地的网络信息(struct sockaddr_in)----------> 办电话卡3.绑定套接字(bind())---------------------------->将电话卡插入手机4.监听套接字(listen())---------------------------->待机5.链接客户端的请求(accept())---------------------->接电话6.接收/发送数据(recv()/send())-------------------->通话7.关闭套接字(close())----------------------------->挂机客户端:1.创建流式套接字(socket())----------------------->有手机2.指定服务器的网络信息(struct sockaddr_in)------->有对方号码3.请求链接服务器(connect())---------------------->打电话4.发送/接收数据(send()/recv())------------------->通话5.关闭套接字(close())--------------------------- >挂机

 2..2:函数接口

socket:创建套接字
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>int socket (int domain,int type, int protocol) ;
功能:创建套接字
参数:domain:协议族AF_UNIX,AF_LOCAL      本地通信AF_INET                ipv4AF_INET6               ipv6type:套接字类型SOCK_STREAM:流式套接字SOCK_DGRAM:数据报套接字SOCK_RAW:原始套接字protocol:协议–填0自动匹配底层,根据type系统默认自动帮助匹配对应协议返回值:成功      文件描述符失败      -1,更新errno
结构体的填充和绑定
int bind (int sockfd,const struct sockaddr * addr ,socklen t addrlen) ;功能:绑定
参数:socket:套接字addr:用于通信结构体(提供的是通用结构体,需要根据选择的通信方式,填充对应
结构体--通信方式由当时socket第一个参数确定)addrlen:结构体大小返回值:成功0    失败-1,更新errno通用结构体:
struct sockaddr {sa_family_t sa_family;char    sa _data [14];
}ipv4通信结构体:
struct sockaddr_in {sa_family_t    sin_family;//协议族in_port_t    sin_port;    //端口号struct in_addr sin_addr;    //ip地址
};
struct in_addr {uint32_t    s_addr;
};本地通信结构体:
struct sockaddr_in{sa_family_t sun_family;    /* AF_UNIX *///协议族char    sun_path [108];    /*pathname *///路径
};
listen :监听套接字
int listen(int sockfd, int backlog);
功能:监听,将主动套接字变为被动套接字
参数:sockfd:套接字backlog:同时响应客户端请求链接的最大个数,不能写0.不同平台可同时链接的数不同,一般写5,10个返回值:成功 0   失败-1,更新errno  
accept:等待连接int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
accept(sockfd,NULL,NULL);
阻塞函数,阻塞等待客户端的连接请求,如果有客户端连接,则accept()函数返回,返回一个用于通信的套接字文件;
参数:Sockfd :套接字addr: 链接客户端的ip和端口号如果不需要关心具体是哪一个客户端,那么可以填NULL;addrlen:结构体的大小如果不需要关心具体是哪一个客户端,那么可以填NULL;返回值: 成功:文件描述符; //用于通信
失败:-1,更新errno
rrecv :接收
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
功能: 接收数据 
参数: sockfd: acceptfd ;//用于通信的文件描述符buf  存放位置len  大小flags  一般填0,相当于read()函数MSG_DONTWAIT  非阻塞
返回值: < 0  失败出错  更新errno==0  表示客户端退出>0   成功接收的字节个数
send :发送
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
功能:发送数据
参数:sockfd:用于通信的文件描述符buf:发送内容存放的地址len:发送内存的长度flags:如果填0,相当于write();
connect:连接
int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
功能:用于连接服务器;
参数:sockfd:socket函数的返回值addr:填充的结构体是服务器端的;addrlen:结构体的大小
返回值 -1 失败,更新errno正确 0 

2.3:服务器端函数编写

#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <errno.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>char buf[1024] = {};int main(int argc, char const *argv[])
{// 创建套接字int sockfd = socket(AF_INET, SOCK_STREAM, 0);if (sockfd < 0){perror("socket create err\n");return -1;}// 填充结构体struct sockaddr_in addr;addr.sin_family = AF_INET;            // IPV4addr.sin_port = htons(atoi(argv[1])); // 主机字节序转换为网络字节序addr.sin_addr.s_addr = INADDR_ANY;// 绑定int ret = bind(sockfd, (struct sockaddr *)&addr, sizeof(addr));if (ret < 0){perror("bind err\n");return -1;}// 监听if (listen(sockfd, 5) < 0){perror("listen err\n");return -1;}// 等待客户端连接// 任何客户端都可以 ,返回通信文件描述符// int len = sizeof(addr);// 设置超时检测while (1){int len = sizeof(addr);int acceptfd = accept(sockfd, (struct sockaddr *)&addr, &len);if (acceptfd < 0){perror("accept err\n");return -1;}// 来电显示printf("通信文件描述符:%d\t", acceptfd);printf("客户端端口:%d\t客户端ip:%s\n", ntohs(addr.sin_port), inet_ntoa(addr.sin_addr));// 接收数据while (1){int rec = recv(acceptfd, buf, 32, 0);if (rec < 0){perror("recv err\n");return -1;}else if (rec == 0){printf("客户端退出\n");break;}printf("%s\n", buf);}close(acceptfd);// 发送数据//  send(acceptfd, buf, sizeof(buf), 0);}// 关闭文件描述符// close(acceptfd);close(sockfd);return 0;
}
2.4:客户端函数编写
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <errno.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>char buf[1024] = {};int main(int argc, char const *argv[])
{// 创建套接字int sockfd = socket(AF_INET, SOCK_STREAM, 0);if (sockfd < 0){perror("socket create err\n");return -1;}// 填充结构体struct sockaddr_in addr;addr.sin_family = AF_INET;            // IPV4addr.sin_port = htons(atoi(argv[1])); // 主机字节序转换为网络字节序addr.sin_addr.s_addr = INADDR_ANY;// 绑定int ret = bind(sockfd, (struct sockaddr *)&addr, sizeof(addr));if (ret < 0){perror("bind err\n");return -1;}// 监听if (listen(sockfd, 5) < 0){perror("listen err\n");return -1;}// 等待客户端连接// 任何客户端都可以 ,返回通信文件描述符// int len = sizeof(addr);// 设置超时检测while (1){int len = sizeof(addr);int acceptfd = accept(sockfd, (struct sockaddr *)&addr, &len);if (acceptfd < 0){perror("accept err\n");return -1;}// 来电显示printf("通信文件描述符:%d\t", acceptfd);printf("客户端端口:%d\t客户端ip:%s\n", ntohs(addr.sin_port), inet_ntoa(addr.sin_addr));// 接收数据while (1){int rec = recv(acceptfd, buf, 32, 0);if (rec < 0){perror("recv err\n");return -1;}else if (rec == 0){printf("客户端退出\n");break;}printf("%s\n", buf);}close(acceptfd);// 发送数据//  send(acceptfd, buf, sizeof(buf), 0);}// 关闭文件描述符// close(acceptfd);close(sockfd);return 0;
}

关键字:产品宣传片公司_四川省重庆市_品牌广告视频_网站提交收录软件

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: