TCP收发——计算机网络——day02

今天主要讲了TCP的收发

TCP发端步骤

复制代码
①socket
②connect
③send
④close

TCP收端步骤

复制代码
①socket
②bind
③listen
④accept
⑤recv
⑥clise

其函数主要有

connect

c 复制代码
int connect(int sockfd, const struct sockaddr *addr,
                   socklen_t addrlen);
  功能:
    发送链接请求
  参数:
    sockfd:套接字文件描述符
    addr:目的地址存放空间首地址
    addrlen:IP地址的大小
  返回值:
    成功返回0
    失败返回-1

send

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

recv

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

listen

c 复制代码
int listen(int sockfd, int backlog);
  功能:
    监听客户端发送的连接请求
    该函数不会阻塞
  参数:
    sockfd:套接字文件描述符
    backlog:允许等待的尚未被处理的三次握手请求的最大个数
  返回值:
    成功返回0 
    失败返回-1 

accept

c 复制代码
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
  功能:
    处理等待连接队列中的第一个连接请求
    该函数具有阻塞功能(如果没有人发送链接请求,会阻塞等待)
  参数:
    socket:套接字文件描述符
    address:存放IP地址的空间首地址
    addrlen:存放IP地址大小空间首地址
  返回值:
    成功返回一个新的文件描述符
    失败返回-1 

eg:利用TCP实现跨主机的文件发送

send端

c 复制代码
#include"head.h"

int main(void)
{
	int sockfd = 0;
	FILE *fp = 0;
	int ret = 0;
	ssize_t nsize = 0;
	ssize_t nret = 0;
	char tmpbuff[4096] = {0};
	struct sockaddr_in srcaddr;
	char filename[256] = {"a.txt"};

	gets(filename);
	
	srcaddr.sin_family = AF_INET;
	srcaddr.sin_port = htons(50000);
	srcaddr.sin_addr.s_addr = inet_addr("192.168.1.152");

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

	ret = connect(sockfd,(struct sockaddr *)&srcaddr,sizeof(srcaddr));
	if(-1 == ret)
	{
		perror("fail to connect");
		return -1;
	}

	nsize = send(sockfd,filename,strlen(filename),0);
	if(-1 == nsize)
	{
		perror("fail to send");
		return -1;
	}

    fp = fopen(filename, "rb");
    if (fp == NULL) 
	{
        perror("fail to fopen");
        return -1;
	}


    while(1)
	{
		memset(tmpbuff,0,sizeof(tmpbuff));
		sleep(1);
		nsize = fread(tmpbuff, sizeof(char), 4096, fp);
		if(0 >= nsize)
		{
			break;
		}
			
        send(sockfd, tmpbuff,nsize, 0);
    }

	close(sockfd);
	fclose(fp);
	return 0;
}

recv端

c 复制代码
#include"head.h"

int main(void)
{
	FILE *file = NULL;
	ssize_t nsize = 0;
	ssize_t nret = 0;
	char name[20] = {0};
	char tmpbuff[4096] = {0};
	int sockfd = 0;
	int recfd = 0;
	int ret = 0;
	struct sockaddr_in recaddr;


	recaddr.sin_family = AF_INET;
	recaddr.sin_port = htons(50000);
	recaddr.sin_addr.s_addr = INADDR_ANY;

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

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

	ret = listen(sockfd,10);
	if(-1 == ret)
	{
		perror("fail to listen");
		return -1;
	}

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

	nret = recv(recfd,name,sizeof(name),0);
	if(-1 == nret)
	{
		perror("fail to recv");
		return -1;
	}

	file = fopen(name,"wb");

	 while ((nsize = recv(recfd, tmpbuff, sizeof(tmpbuff), 0)) > 0)
    {
        if (fwrite(tmpbuff, sizeof(char), nsize, file) < nsize)
        {
            perror("fail to write file");
            fclose(file);
            close(recfd);
            close(sockfd);
            return -1;
        }
    }

	close(recfd);
	fclose(file);
	close(sockfd);

	return 0;
}

结果:

以上就是今天内容!

相关推荐
七七&5566 小时前
2024年08月13日 Go生态洞察:Go 1.23 发布与全面深度解读
开发语言·网络·golang
元清加油6 小时前
【Golang】:函数和包
服务器·开发语言·网络·后端·网络协议·golang
No0d1es6 小时前
电子学会青少年软件编程(C/C++)5级等级考试真题试卷(2024年6月)
c语言·c++·算法·青少年编程·电子学会·五级
炫友呀7 小时前
Centos 更新/修改宝塔版本
linux·运维·centos
向日葵.8 小时前
fastdds.ignore_local_endpoints 属性
服务器·网络·php
athink_cn10 小时前
HTTP/2新型漏洞“MadeYouReset“曝光:可发动大规模DoS攻击
网络·网络协议·安全·http·网络安全
zzc92110 小时前
TLSv1.2协议与TCP/UDP协议传输数据内容差异
网络·测试工具·安全·wireshark·ssl·密钥·tlsv1.2
Peter_Deng.11 小时前
Linux 下基于 TCP 的 C 语言客户端/服务器通信详解(三个示例逐步进阶)
服务器·c语言·网络
花小璇学linux11 小时前
imx6ull-驱动开发篇24——Linux 中断API函数
linux·驱动开发·嵌入式软件
林开落L11 小时前
库制作与原理(下)
linux·开发语言·centos·库制作与原理