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等网络编程的相关接口,对我们后续的学习是非常有帮助的;
最后,各位小伙伴们如果喜欢我的分享可以点赞收藏哦,你们的认可是我创作的动力,一起加油!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
TCP网络编程是使用TCP协议进行网络通信的编程技术,它可以实现可靠的、面向连接的数据传输。在Java中,可以使用Socket类和ServerSocket类实现TCP网络编程。 在TCP网络编程中,通常有客户端和服务端两个角色。客户端通过创建一个Socket对象与服务端建立连接,并通过该Socket对象进行数据的发送和接收。服务端通过创建一个ServerSocket对象监听指定的端口号,等待客户端的连接请求,一旦接收到连接请求,就会创建一个Socket对象与客户端进行通信。 在提供的引用中,有三个示例代码:SocketTCP03Server、SocketTCP02Client和SocketTCP02Server。这些示例代码演示了基本的TCP网络编程过程。 SocketTCP03Server示例代码展示了服务端的实现。它创建一个ServerSocket对象,并监听9999端口。一旦接收到连接请求,就会创建一个Socket对象与客户端进行通信。通过Socket对象的getInputStream()方法获取输入流,可以读取客户端发送的数据。通过Socket对象的getOutputStream()方法获取输出流,可以向客户端发送数据。最后,关闭相关的流和Socket连接。 SocketTCP02Client示例代码展示了客户端的实现。它创建一个Socket对象,并指定服务器的IP地址和端口号。通过Socket对象的getOutputStream()方法获取输出流,可以向服务器发送数据。通过Socket对象的getInputStream()方法获取输入流,可以读取服务器返回的数据。最后,关闭相关的流和Socket连接。 SocketTCP02Server示例代码也展示了服务端的实现。它创建一个ServerSocket对象,并监听9999端口。一旦接收到连接请求,就会创建一个Socket对象与客户端进行通信。通过Socket对象的getInputStream()方法获取输入流,可以读取客户端发送的数据。通过Socket对象的getOutputStream()方法获取输出流,可以向客户端发送数据。最后,关闭相关的流和Socket连接。 通过阅读这些示例代码,你可以了解到如何使用Java进行TCP网络编程。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Java网络编程 ---- TCP 网络通信编程](https://blog.csdn.net/m0_53022813/article/details/124638452)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值