TCP网络编程

这篇具有很好参考价值的文章主要介绍了TCP网络编程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

上期分享了UDP下的网络编程,相信大家对网络通信已经有了自己的一些认知,那么我们本期就进一步来看一下TCP下的网络编程,感受一下TCP和UDP的相同点和不同点,实践证明一切,让我们来看看吧!


一、TCP简介—传输控制协议

1. 特点

	(1)实现复杂
	(2)资源开销大
    (3)安全、可靠

2. 安全可靠

	(1)传输数据前使用三次握手建立连接
	(2)传输过程中有确认、应答机制
	(3)传输结束时使用四次挥手结束连接

3. TCP通信流程

	TCP是面向连接的传输方式(有连接)
	UDP是无连接的
	发送端:
		(1)socket 
		(2)connect 
		(3)send
		(4)recv 
		(5)close 
				
    接收端:
		(1)socket
		(2)bind 
		(3)listen 
		(4)accept 
		(5)recv 
		(6)send
		(7)close

二、TCP函数接口

2.1 socket

int socket(int domain, int type, int protocol);
功能:
		创建一个用来通信的套接字文件描述符
参数:
		domain:通信域		AF_INET		IPv4协议
		type:
			SOCK_DGRAM		用户数据报套接字		UDP		
			SOCK_STREAM		流式套接字		    TCP
			SOCK_RAW		原始套接字		
		protocol:
					默认为0 
返回值:
		成功返回新文件描述符
		失败返回-1 

2.2 bind

int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
功能:
		将IP地址和套接字绑定
参数:
		sockfd:套接字文件描述符
		addr:IP地址空间首地址
		addrlen:IP地址长度
返回值:
		成功返回0
		失败返回-1 		

2.3 listen

int listen(int sockfd, int backlog);
功能:
		监听三次握手链接请求
参数:
		sockfd:套接字文件描述符
		backlog:最大允许等待尚未建立连接的请求个数
返回值:
		成功返回0 
		失败返回-1 

2.4 connect

int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
功能:
			向收端发送三次握手链接
参数:
			sockfd:套接字
			addr:目的地址 
			addrlen:目的地址长度
返回值:
			成功返回0 
			失败返回-1 
	
有阻塞功能:	如果接收方三次握手连接完成不了,则会导致connect阻塞

2.5 accept

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
功能:
		接收三次握手链接请求,并建立一个新套接字
参数:
		sockfd:套接字
		addr:存放发送方IP地址空间首地址
		addrlen:IP地址长度
返回值:
		成功返回新文件描述符
		失败返回-1 

2.6 recv

ssize_t recv(int sockfd, void *buf, size_t len, int flags);
功能:
		接收数据
参数:
		sockfd:文件描述符
		buf:存放接收数据空间首地址
		len:最大接收数据的长度
		flags:属性默认为0 
返回值:
		失败返回-1 
		成功返回实际接收字节数
		返回0 对方断开连接

2.7 send

ssize_t send(int sockfd, const void *buf, size_t len, int flags);
功能:
		发送数据 
参数:
		sockfd:套接字文件描述符
		buf:发送数据空间首地址 
		len:发送数据长度 
		flags:属性 默认为0 
返回值:
		成功返回实际发送字节数
		失败返回-1 

三、TCP通信实例

1. 功能介绍

(1)发送端发送hello world给接收端
(2)接收端进行接收并打印收到的消息

2. 引入库

头文件如下:

#ifndef __HEAD_H__
#define __HEAD_H__

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#endif

3. 发送端

发送端首先创建sockfd套接字,进而对ip地址进行请求访问,发送hello world的消息,代码如下:

#include "head.h"

int main(int argc, const char *argv[])
{
	int sockfd = 0;
	struct sockaddr_in sendsddr;
	int ret = 0;
	char tmpbuff[1024] = {0};
	ssize_t nsize = 0;

	sockfd = socket(AF_INET, SOCK_STREAM, 0);
	if (-1 == sockfd)
	{
		perror("fail to sockfd");
		return -1;
	}

	sendsddr.sin_family = AF_INET;
	sendsddr.sin_port = htons(50000);
	sendsddr.sin_addr.s_addr = inet_addr("192.168.209.128");
	
	ret = connect(sockfd, (struct sockaddr *)&sendsddr, sizeof(sendsddr));
	if (-1 == ret)
	{
		perror("fail to connect");
		return -1;
	}

	sprintf(tmpbuff, "hello world!");
	nsize = send(sockfd, tmpbuff, strlen(tmpbuff), 0);
	if (-1 == nsize)
	{
		perror("fail to send");
		return -1;
	}

	return 0;
}

4. 发送端

接收端接受来自于发送端的消息并进行打印,代码如下:

#include "head.h"

int main(int argc, const char *argv[])
{	
	int sockfd = 0;
	struct sockaddr_in recvaddr;
	int confd = 0;
	int ret = 0;
	char tmpbuff[1024] = {0};
	ssize_t nsize = 0;

	sockfd = socket(AF_INET, SOCK_STREAM, 0);
	if (-1 == sockfd)
	{
		perror("fail to sockfd");
		return -1;
	}

	recvaddr.sin_family = AF_INET;
	recvaddr.sin_port = htons(50000);
	recvaddr.sin_addr.s_addr = inet_addr("192.168.209.129");

	ret = bind(sockfd, (struct sockaddr *)&recvaddr, sizeof(recvaddr));
	if (-1 == ret)
	{
		perror("fail to bind");
		return -1;
	}
	
	ret = listen(sockfd, 10);
	if (-1 == ret)
	{
		perror("fail to listen");
		return -1;
	}

	confd = accept(sockfd, NULL, NULL);
	if (-1 == confd)
	{
		perror("fail to accept");
		return -1;
	}

	nsize = recv(confd, tmpbuff, sizeof(tmpbuff), 0);
	if (nsize <= 0)
	{
		perror("fail to recv");
		return -1;
	}

	printf("recv:%s\n", tmpbuff);

	return 0;
}

这个就是使用tcp进行单向通信的一个简单例子,各位小伙伴可以来练练手,看下对TCP的掌握如何,如果可以还可以编写双向通信实例;

总结

本期主要分享的是TCP网络编程的相关函数接口以及具体实现的方法,希望大家一定得掌握socket,bind,accept,connect,send,recv等网络编程的相关接口,对我们后续的学习是非常有帮助的;
最后,各位小伙伴们如果喜欢我的分享可以点赞收藏哦,你们的认可是我创作的动力,一起加油!文章来源地址https://www.toymoban.com/news/detail-470891.html

到了这里,关于TCP网络编程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C++】6.网络编程:网络编程(TCP&UDP)

    网络编程是C++ API操作中很重要的一部分,包含 TCP 和 UDP 。 网络传输模型可以抽象为7个层: 物理层、数据链路层、网络层、传输层、会话层、表示层、应用层 。 但在使用TCP/IP协议时,可以简化为这4层: 网络接口、网络层、传输层、应用层 。 TCP:可靠传输,三次握手建立

    2024年02月16日
    浏览(32)
  • 网络编程 TCP电子网络词库

     电子词典: 要求: 登录注册功能,不能重复登录,重复注册。用户信息也存储在数据库中。 单词查询功能 历史记录功能,存储单词,意思,以及查询时间,存储在数据库 基于TCP,支持多客户端连接 采用数据库保存用户信息与历史记录 将dict.txt的数据导入到数据库中保存。

    2024年02月17日
    浏览(31)
  • 网络编程『简易TCP网络程序』

    🔭个人主页: 北 海 🛜所属专栏: Linux学习之旅、神奇的网络世界 💻操作环境: CentOS 7.6 阿里云远程服务器 随着数字时代的来临,TCP网络程序已成为程序员不可或缺的技术领域。本博客将带领读者深入研究,从最基础的字符串回响开始,逐步探索至多进程、多线程服务器

    2024年02月04日
    浏览(36)
  • 网络编程 -- 简易TCP网络程序

      字符串回响程序类似于 echo 指令,客户端向服务器发送消息,服务器在收到消息后会将消息发送给客户端,该程序实现起来比较简单,同时能很好的体现 socket 套接字编程的流程。      这个程序我们已经基于 UDP 协议实现过了,换成 TCP 协议实现时,程序的结构是没有变化

    2024年04月25日
    浏览(32)
  • 网络编程 —— TCP 和 UDP 编程详解

    目录 网络编程主要函数介绍 1. socket 函数 2. bind 函数 3. listen 函数 4. accept 函数 5. connect 函数 6. send 函数 7. recv 函数 8. recvfrom 函数 9. sendto 函数 TCP 和 UDP 原理上的区别 TCP 编程 服务端代码: 客户端代码: UDP 编程 服务端代码: 客户端代码: 1. socket 函数 int socket(int domain, int

    2024年02月04日
    浏览(33)
  • 网络编程【TCP流套接字编程】

    目录 TCP流套接字编程 1.ServerSocket API 2.Socket API 3.TCP中的长短连接 4.回显程序(短连接) 5.服务器和客户端它们的交互过程 6.运行结果及修改代码   ❗❗两个核心: ServerSocket     Socket 1.ServerSocket API ✨ ServerSocket 是创建 TCP服务端Socket的API ServerSocket 构造方法: ServerSocket 方法 :

    2023年04月12日
    浏览(55)
  • 【网络编程】网络编程概念,socket套接字,基于UDP和TCP的网络编程

    前言: 大家好,我是 良辰丫 ,今天我们一起来学习网络编程,网络编程的基本概念,认识套接字,UDP与TCP编程.💞💞💞 🧑个人主页:良辰针不戳 📖所属专栏:javaEE初阶 🍎励志语句:生活也许会让我们遍体鳞伤,但最终这些伤口会成为我们一辈子的财富。 💦期待大家三连,关注

    2023年04月20日
    浏览(42)
  • 网络编程 tcp udp http编程流程 网络基础知识

    OSI分层:应用层 表示层 会话层 传输层 网络层 数据链路层 物理层 tcp/ip: 应用层 传输层 网络层 数据链路 ip地址:唯一标识一台主机 ipv4 32位 ipv6 128位 寻址 可以反映物理上的一个变化 MAC地址:48 固化在计算机中 ip地址又两部分构成:网络号+主机号 端口号:标识一个应用程序

    2024年02月13日
    浏览(56)
  • 【Linux网络编程】网络编程套接字(TCP服务器)

    作者:爱写代码的刚子 时间:2024.4.4 前言:本篇博客主要介绍TCP及其服务器编码 只介绍基于IPv4的socket网络编程,sockaddr_in中的成员struct in_addr sin_addr表示32位 的IP地址 但是我们通常用点分十进制的字符串表示IP地址,以下函数可以在字符串表示和in_addr表示之间转换 字符串转in

    2024年04月14日
    浏览(53)
  • TCP/IP网络编程(一) 理解网络编程和套接字

    网络编程和套接字概要 网络编程就是编写程序使两台联网的计算机相互交换数据 为了与远程计算机进行数据传输,需要连接因特网,而编程种的套接字就是用来连接该网络的工具。 构建套接字 1.调用soecket函数创建套接字 2.调用bind函数给套接字分配地址 3.调用listen函数将套

    2024年02月11日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包