首页 > 其他分享 >基于c语言的TCP客户端、服务端基础代码

基于c语言的TCP客户端、服务端基础代码

时间:2024-06-05 20:11:27浏览次数:21  
标签:addr int tcp socket TCP include sin 服务端 客户端

基于c语言的TCP客户端、服务端基础代码

基本流程:

image

  1. 客户端:
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <errno.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/udp.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <unistd.h>

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
*   tcp客户端(发送)
*
*
*
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
int main(int argc, char *argv[])
{
    // 检查参数有效性
    if (argc != 3)
    {
        fprintf(stderr, "argument is invaild ,errno:%d,%s\n", errno, strerror(errno));
        exit(1);
    }

    int sockfd = socket(AF_INET, SOCK_STREAM, 0);

    struct sockaddr_in addr;
    addr.sin_family = AF_INET;             // 协议族,是固定的
    addr.sin_port = htons(atoi(argv[1]));  // 服务器端口,必须转换为网络字节序
    addr.sin_addr.s_addr = inet_addr(argv[2]); // 服务器地址 "192.168.64.xxx"

    connect(sockfd, (struct sockaddr *)&addr, sizeof(addr));

    char sendbuff[100];
    char recvbuff[100];

    while (1)
    {
        bzero(sendbuff, 100);
        scanf("%s",sendbuff);
        // fgets(sendbuff, 100, stdin);

        // 向服务端发送数据
        write(sockfd, sendbuff, strlen(sendbuff));

        // 接收TCP回弹服务器的消息
        
        printf("收到消息recvbuff = %s\n", recvbuff);
        bzero(recvbuff, 100);
    }
    close(sockfd);
    return 0;
}
  1. 服务端:


#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <errno.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/udp.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
 #include <unistd.h>
//TCP服务器代码   ./xxx   port

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*
*   tcp服务端(接收)
*
*
*
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
int main(int argc, char const *argv[])
{
	//1.创建TCP套接字
	int tcp_socket = socket(AF_INET, SOCK_STREAM, 0);
	if (tcp_socket == -1)
	{
		fprintf(stderr, "tcp socket error,errno:%d,%s\n",errno,strerror(errno));
		exit(1);
	}

	//2.绑定自身的IP地址和端口
	struct sockaddr_in  host_addr;

	host_addr.sin_family 		= AF_INET; 						//协议族,是固定的
	host_addr.sin_port   		= htons(atoi(argv[1]));			//目标端口,必须转换为网络字节序
	host_addr.sin_addr.s_addr   = htonl(INADDR_ANY);		    //目标地址  INADDR_ANY 这个宏是一个整数,所以需要使用htonl转换为网络字节序

	bind(tcp_socket,(struct sockaddr *)&host_addr, sizeof(host_addr));

	//3.设置监听  队列最大容量是5
	listen(tcp_socket,5);

	//4.等待接受客户端的连接请求
	struct sockaddr_in  client;
	socklen_t client_len = sizeof(client);

	int connect_fd = accept(tcp_socket,(struct sockaddr *)&client,&client_len); //会阻塞
	char buf[128] = {0};

	//5.说明双方建立连接,此时可以接收数据
	while(1)
	{
		
		
		read(connect_fd,buf,sizeof(buf));
		printf("recv from [%s],data is = %s\n", inet_ntoa(client.sin_addr) ,buf);
		bzero(buf,sizeof(buf));
	}


	return 0;
}
  1. 三次握手示意图:
    image

  2. 示意图解释:

第一次握手:发送一个SYN标记(请求同步标记)

​ 发送一个序列号seq:x

第二次握手:返回一个SYN标记

​ 返回一个ACK(应答标记,表示我知道了)

​ 返回一个序列号seq:y

​ 返回一个x+1序列号ack(告诉客户端希望下一次数据从+1开始)

第三次握手:发送一个ACK标记

​ 发送一个序列号seq:x+1

​ 发送一个序列号ack:y+1

标签:addr,int,tcp,socket,TCP,include,sin,服务端,客户端
From: https://www.cnblogs.com/zcx0326/p/18233679

相关文章

  • TCP概述
    概述TPC:传输控制协议,TCP协议是面向连接的、可以实现端对端通信的可靠的协议。TCP协议传输数据时会为每个字节分配一个序列号,通过这个序列号就可以判断数据是否重复到达以及数据是否丢失,还可以通过序列号对数据进行排序。报首格式TCP建立连接的三次握手过程TCP三次挥手过......
  • TCP协议网络通信
    TCP协议网络通信目录TCP协议网络通信头文件/宏定义客户端服务器验证结果客户端服务器头文件/宏定义#include<stdio.h>#include<stdlib.h>#include<string.h>#include<arpa/inet.h>#include<netinet/in.h>#include<sys/types.h>#include<sys/socket.h>#includ......
  • eladmin-mp 低代码生成后台页面和服务端java代码接口调研
    概述总体这个项目前端使用vue2,后端使用springbootgit地址https://github.com/elunez/eladmin-mp预览地址https://eladmin.vip/demo/#/sys-tools/generator数据表配置低代码下载生成后的前端代码示例生成的后端代码示例:这里可以配置生成自动放在项目的目录......
  • TCP和UDP
    TCP和UDPTCP的可靠性特性序列号(Sequencing):TCP为每个传输的数据段分配一个唯一的序列号,接收端可以根据这些序列号重新组装数据。确认与重传(AcknowledgmentandRetransmission):TCP使用确认机制来确认数据段是否成功到达。如果接收端没有收到某个数据段,发送端会重传它。流量控......
  • TCP_FLAGS_PROCESSING_09: [close-wait| closing | last-ack] FIN -> ignore
    测试目的:验证TCP在CLOSE-WAIT、CLOSING或LAST-ACK状态下,接收到FIN段时是否能够保持当前状态不变。描述:TCP在CLOSE-WAIT、CLOSING或LAST-ACK状态下,当接收到一个FIN段时,不应改变其状态。这是确保TCP连接能够按照正常的关闭序列进行,避免状态的意外变化。测试拓扑:具体步骤......
  • 接上篇,客户端实现,图形界面编程,利用socket和UCP/TCP编写,客户端和服务器端程序可以进行
     1.项目结构 1.1基本架构本项目采用基于Java的`Swing`库进行图形界面开发,并使用`Socket`进行网络通信。项目包名为`org.example.tcp`。 1.2模块划分项目主要分为以下几个模块:图形用户界面(GUI)模块网络通信模块线程处理模块 2.GUI设计 2.1主窗口设计 2.1.1......
  • Redis——Java的客户端
    Java的客户端在Redis官网中提供了各种语言的客户端,地址:https://redis.io/clientsjedisjedis的官网地址:https://github.com/redis/jedis1.引入依赖<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>5.0......
  • Git客户端工具:SourceTree for Mac v 4.1.5中文特别版
    SourceTree是一款由Atlassian公司推出的免费的Git和Mercurial版本控制系统的可视化客户端工具。它提供了一种简单易用的方式来管理和查看代码的版本历史,以及进行代码的比较、合并和提交等操作。用户可以通过SourceTree轻松地管理多个代码仓库,并且可以直观地查看代码的变化和提......
  • Windows下载安装RabbitMQ客户端(2024最新篇)
    文章目录RabbitMQ认知RabbitMQ下载RabbitMQ安装更多相关内容可查看RabbitMQ认知定义:RabbitMQ是一个消息中间件,它接受并转发消息。你可以把它当做一个快递站点,当你要发送一个包裹时,你把你的包裹放到快递站,快递员最终会把你的快递送到收件人那里。RabbitMQ与快递站......
  • 利用进程池给客户端传文件
    主函数#include<func.h>#include"process_pool.h"#include"server.h"#include"transferFd.h"#defineEVENTSNUM100intmain(intargc,char*argv[]){//ipportprocessNumif(argc!=4){error(1,errno,"......