TCP套接字编程实例(一)

2023-05-16

TCP套接字编程实例(一)

TCP套接字编程第一部分我们先用单线程简单实现客户端的“发”和服务器的“收”。话不多说,直接上代码。

1.Client部分:

 

#include
#include
#include
#include
#include
#include
#include
#include 
#include
 
#define IP "127.0.0.1"
#define PORT 7788
#define MAXLEN 1024
 
int main(int argc,char* argv[])
{
    int sock_fd = 0;
    int iret = 0;
    struct sockaddr_in sock_addr;
    char buf[MAXLEN] = {0};
 
    //创建socket
    if((sock_fd = socket(AF_INET,SOCK_STREAM,0)) < 0)
    {
        perror("socket error");
        exit(1);
    }
 
    //发送连接服务器的请求
    memset(&sock_addr,0,sizeof(sock_addr));
    sock_addr.sin_family = AF_INET;
    sock_addr.sin_port = htons(PORT);
    sock_addr.sin_addr.s_addr = inet_addr(IP);
 
    if(connect(sock_fd,(struct sockaddr*)(&sock_addr),sizeof(sock_addr))==-1)
    {
        perror("connect error");
        exit(1);
    }
    printf("connect success!\n");
 
    while(1) //发送数据
    {
        memset(buf,'\0',sizeof(buf));
        gets(buf);
        
        iret=write(sock_fd,buf,strlen(buf));
        printf("write data:%s,len=%d\n",buf,iret);
        
        if(strcmp(buf,"quit") == 0)
        {
            printf("即将退出 ...\n");
            sleep(3);
            break;
        }
    }
 
    close(sock_fd); //关闭套接字
 
    return 0;
}
#include
#include
#include
#include
#include
#include
#include 
#include
 
#define IP "127.0.0.1"
#define PORT 7788
#define MAXLEN 1024
 
int main(int argc,char* argv[])
{
    int sock_fd = 0;
    int iret = 0;
    struct sockaddr_in sock_addr;
    char buf[MAXLEN] = {0};
 
    //创建socket
    if((sock_fd = socket(AF_INET,SOCK_STREAM,0)) < 0)
    {
        perror("socket error");
        exit(1);
    }
 
    //发送连接服务器的请求
    memset(&sock_addr,0,sizeof(sock_addr));
    sock_addr.sin_family = AF_INET;
    sock_addr.sin_port = htons(PORT);
    sock_addr.sin_addr.s_addr = inet_addr(IP);
 
    if(connect(sock_fd,(struct sockaddr*)(&sock_addr),sizeof(sock_addr))==-1)
    {
        perror("connect error");
        exit(1);
    }
    printf("connect success!\n");
 
    while(1) //发送数据
    {
        memset(buf,'\0',sizeof(buf));
        gets(buf);
        
        iret=write(sock_fd,buf,strlen(buf));
        printf("write data:%s,len=%d\n",buf,iret);
        
        if(strcmp(buf,"quit") == 0)
        {
            printf("即将退出 ...\n");
            sleep(3);
            break;
        }
    }
 
    close(sock_fd); //关闭套接字
 
    return 0;
}

 

2.server部分

 

#include
#include
#include
#include
#include
#include
#include
#include
 
#define PORT 7788
#define IP "127.0.0.1"
 
int main(int argc,char* argv[])
{
    int sock,new_fd;
    struct sockaddr_in self_addr,recv_addr;
    int iret =0,len =0;
    char buf[100] = {'\0'};
    int fd = 0;
    int ret = 0;
 
    //创建套接字
    sock = socket(AF_INET,SOCK_STREAM,0);
    if(sock < 0)
    {
        perror("socket error");
        exit(0);
    }
 
    //绑定自己的端口号
    memset(&self_addr,0,sizeof(self_addr));
    self_addr.sin_family = AF_INET;
    self_addr.sin_port = htons(PORT);
    self_addr.sin_addr.s_addr = INADDR_ANY;
 
    if(bind(sock,(struct sockaddr*)&self_addr,sizeof(self_addr)) == -1)
    {
        perror("bind error");
        exit(0);
    }
 
    //监听
    if(listen(sock,5) == -1)
    {
        perror("listen error");
        exit(0);
    }
 
    while(1)
    {
        //接受客户端的连接请求
        memset(&recv_addr,0,sizeof(recv_addr));
        printf("wait for connect\n");
        if((new_fd = accept(sock,(struct sockaddr*)&recv_addr,&len)) == -1)
        {
            perror("accept error");
            exit(0);
        }
        printf("connect ok\n");
 
        //接收数据
        while(1)
        {
            if(read(new_fd,buf,sizeof(buf)) <= 0) //注意加上“=”,避免客户端退出服务器读到空数据而造成死循环
            {
                printf("client is outline\n");
                break;
            }
            else
                printf("buf is %s\n",buf);
            memset(buf,'\0',sizeof(buf));
        }
    }
 
    close(new_fd);
    close(sock); //关闭套接字
 
    return 0;
}
#include
#include
#include
#include
#include
#include
#include
 
#define PORT 7788
#define IP "127.0.0.1"
 
int main(int argc,char* argv[])
{
    int sock,new_fd;
    struct sockaddr_in self_addr,recv_addr;
    int iret =0,len =0;
    char buf[100] = {'\0'};
    int fd = 0;
    int ret = 0;
 
    //创建套接字
    sock = socket(AF_INET,SOCK_STREAM,0);
    if(sock < 0)
    {
        perror("socket error");
        exit(0);
    }
 
    //绑定自己的端口号
    memset(&self_addr,0,sizeof(self_addr));
    self_addr.sin_family = AF_INET;
    self_addr.sin_port = htons(PORT);
    self_addr.sin_addr.s_addr = INADDR_ANY;
 
    if(bind(sock,(struct sockaddr*)&self_addr,sizeof(self_addr)) == -1)
    {
        perror("bind error");
        exit(0);
    }
 
    //监听
    if(listen(sock,5) == -1)
    {
        perror("listen error");
        exit(0);
    }
 
    while(1)
    {
        //接受客户端的连接请求
        memset(&recv_addr,0,sizeof(recv_addr));
        printf("wait for connect\n");
        if((new_fd = accept(sock,(struct sockaddr*)&recv_addr,&len)) == -1)
        {
            perror("accept error");
            exit(0);
        }
        printf("connect ok\n");
 
        //接收数据
        while(1)
        {
            if(read(new_fd,buf,sizeof(buf)) <= 0) //注意加上“=”,避免客户端退出服务器读到空数据而造成死循环
            {
                printf("client is outline\n");
                break;
            }
            else
                printf("buf is %s\n",buf);
            memset(buf,'\0',sizeof(buf));
        }
    }
 
    close(new_fd);
    close(sock); //关闭套接字
 
    return 0;
}

 

结果:(Ubuntu的拼写错误请忽略)

 

至此,简单的TCP套接字编程就完成了,思路很简单,只是一些函数比较复杂而已,相关函数自行搜索了解其意照章使用即可。接下来,就是加上多线程,加上select等等,使其变得更实用,更灵活。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TCP套接字编程实例(一) 的相关文章

  • 一文弄懂GPIO不同模式之间的区别与实现原理

    GPIO全称General Purpose Input Output xff0c 即通用输入 输出 其实GPIO的本质就是芯片的一个引脚 xff0c 通常在ARM中所有的I O都是通用的 不过 xff0c 由于每个开发板上都会设计不同的外围
  • printf()是如何与UART外设驱动函数“勾搭”起来的?

    今天给大家分享的是IAR下调试信息输出机制之硬件UART外设 在嵌入式世界里 xff0c 输出打印信息是一种非常常用的辅助调试手段 xff0c 借助打印信息 xff0c 我们可以比较容易地定位和分析程序问题 在嵌入式应用设计里实现打印信息输
  • 卡塔尔世界杯:带“芯片”的智能足球亮相!背后藏着哪些技术原理?

    2022年卡塔尔世界杯正式开幕 xff01 揭幕战上 xff0c 厄瓜多尔队以2 0的比分击败东道主卡塔尔队 xff0c 取得本届世界杯的首场胜利 本场比赛后 xff0c 世界杯东道主首战不败的纪录就此作古 xff0c 这一消息也引发足球圈
  • 串口通信详解

    一 串口通讯简介 串口通信 Serial Communications 的概念非常简单 xff0c 串口按位 bit 发送和接收字节 尽管比按字节 byte 的并行通信慢 xff0c 但是串口可以在使用一根线发送数据的同时用另一根线接收数据
  • C++类详解(public、private、protected)

    二 C 43 43 类的声明 类使用class关键字声明 xff0c 声明方法如下 xff1a class 类名 xff1a public 公有成员 int num private 私有成员 int age protected 保护成员 i
  • linux下网络通信(udp通信协议详解)

    一 udp通信简介 udp是User Datagram Protocol的简称 xff0c 中文名是用户数据报协议 udp协议位于osi模型中的传输层 xff0c 它是一种面向无连接的协议 udp协议并不保证数据一定能够到达对端 xff0c
  • 广播地址、组播地址、网关和子网掩码

    一 IP地址分类 IP地址一共32位 xff0c 由两部分组成 xff0c 网络号和主机号 网络号标识当前设备处于Internet的哪一个网络 xff0c 主机号标识当前设备属于该网络中的那一台主机 IP地址一共分为5类 xff1a 地址分
  • URL格式

    一 URL基本格式 一个完整的url包含方案 用户名 密码 主机名 端口 路径 参数 查询和片段 xff0c 格式如下 xff1a lt scheme gt lt user gt lt password gt 64 lt host gt l
  • c++构造函数和析构函数

    一 构造函数和析构函数的特点 构造函数和析构函数是一种特殊的公有成员函数 xff0c 每一个类都有一个默认的构造函数和析构函数 xff1b 构造函数在类定义时由系统自动调用 xff0c 析构函数在类被销毁时由系统自动调用 xff1b 构造函
  • linux下常用压缩命令

    一 tar命令 tar命令用来打包一个目录 xff0c 它支持三种格式 xff1a tar bz2 34 和 gz 34 1 1 压缩 tar cvf 文件名 tar 文件目录 打包成 tar文件 tar jcvf 文件名 tar bz2
  • 用vscode开发autojs,输出窗口不显示任何输出结果

    我的情况是 xff1a 我vscode开发autojs 程序 xff0c 之前在一切正常的情况下 xff0c 输出窗口可以正常显示程序运行结果 xff0c 右侧红圈里可以选择我连接的手机型号 如下图 xff1a 但是现在出现问题 xff1a
  • ubuntu开机没有ens33解决方法

    最近重新安装了VMware xff0c 使用之前的ubuntu镜像 xff0c 发现只有一个lo网卡 xff0c 没有ens33 xff0c 虚拟机无法获取ip地址 xff0c samba服务器也无法正常使用 root 64 ubuntu
  • ubuntu下arm-none-eabi-gcc安装

    一 下载安装包 下载地址 xff1a https launchpad net gcc arm embedded 43 download 选择linux版本下载 xff1a gcc arm none eabi 5 4 2016q3 20160
  • 2.4G-WiFi连接路由器过程

    一 概述 WiFi的数据通信基于802 11协议进行 xff0c 无线AP在工作时会定时向空中发送beacon数据包 xff0c 基站 xff08 STA xff09 从beacon中解析出AP的名称 加密方式等信息 xff0c 从而发起连
  • STM32f103时钟树详解

    一 概述 stm32有四种时钟信号源 xff0c HSE 高速外部时钟 HSI xff08 高速内部时钟 xff09 LSE xff08 低速外部时钟 xff09 LSI xff08 低速内部时钟 xff09 HSE通常接8M晶振 xff0
  • 头文件重复包含

    一 头文件重复包含问题分析 1 问题重现 举例说明 假设在某个C 43 43 头文件 或 源文件 中 xff0c 包含了A h和B h两个头文件 xff1a span class token macro property span clas
  • Netty 学习(六)实现自定义协议通信

    目录 前言一 通信协议设计通用协议自定义协议网络协议需要具备的要素1 魔数2 协议版本号3 序列化算法4 报文类型5 长度域字段6 请求数据7 状态8 校验字段9 保留字段 二 Netty 实现自定义通信协议Netty 中编解码器分类 三
  • ABB机器人与上位机进行Socket通信的RAPID代码实现(服务端)

    文章目录 前言1 实现的功能2 建立Socket通信2 1 ABB机器人的IP地址 xff1a 2 2 SocketAccept的说明 3 服务端接发信息3 1 核心代码3 2 CurrentPos函数 4 完整代码5 实现效果 前言 本文
  • ros使用自定义消息时,编译不成功,在Cmake中报错.

    在使用自定义消息时 xff0c 按照教程添加依赖和cmakelist文件后 xff0c 保证几条Cmake语句顺序无误的情况下 xff0c 考虑msg文件夹的位置 xff0c 应在功能包的第一级目录中
  • C语言加强--韦老师公开课

    目录 1 变量与指针 摘要 xff1a 普通变量 指针变量所占的内存空间大小 xff0c 变量在内存中的分配方式 xff08 首地址要求 长度 分配长度与实际使用长度区别 需要填充字节数 全局与局部变量在内存中的位置 xff09 xff1b

随机推荐