GEC6818网络编程——服务器端与客户端tcp的双向通信

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

网络编程——服务器端与客户端tcp的双向通信

网络编程之实现服务器和客户端的tcp双向通信,前面是双向通信的详细流程介绍,后面附上完整的代码o( ̄▽ ̄)ブ

一、 服务器端

1.1 服务器端双向通信的详细流程叙述

  1. 创建TCP套接字

    tcpsock = socket(AF_INET, SOCK_STREAM, 0);
    

    使用socket函数创建一个TCP套接字。这里使用了IPv4地址族AF_INET和流式套接字SOCK_STREAM

  2. 绑定IP和端口

    ret = bind(tcpsock, (struct sockaddr *)&bindaddr, sizeof(bindaddr));
    

    使用bind函数将套接字与指定的IP地址和端口绑定。

  3. 开始监听

    ret = listen(tcpsock, 5);
    

    使用listen函数开始监听客户端的连接请求,设置最大等待连接数为5。

  4. 接受客户端连接

    newsock = accept(tcpsock, (struct sockaddr *)&boyaddr, &addrsize);
    

    使用accept函数等待并接受客户端的连接请求。一旦有客户端连接,accept函数返回一个新的已连接套接字。

  5. 创建发送消息的子线程

    pthread_create(&id, NULL, sendmsgtoclient, NULL);
    

    使用pthread_create函数创建一个新的线程,该线程的任务是从服务器控制台读取输入,并通过write函数发送到客户端。

  6. 接收消息

    read(newsock, rbuf, 100);
    

    使用read函数从已连接套接字中读取客户端发送的消息。

  7. 关闭套接字

    close(tcpsock);
    close(newsock);
    

    使用close函数关闭TCP套接字和已连接套接字,释放资源。

总结:此服务器程序的核心是使用TCP套接字与客户端建立连接,然后创建一个专用的线程来发送消息给客户端。主线程负责接收客户端的消息,并将这些消息打印在服务器控制台上。

1.2 服务器端双向通信完整代码

#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <strings.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <pthread.h>
/*
    多线程实现tcp双向通信
    服务器的代码
*/
int newsock;
//线程的任务函数--》专门发送信息给客户端
void *sendmsgtoclient(void *arg)
{
    char sbuf[100];
    while(1)
    {
        bzero(sbuf,100);
        printf("请输入要发送给客户端的信息!\n");
        scanf("%s",sbuf);
        write(newsock,sbuf,strlen(sbuf));
    }
    
}
int main()
{
    int tcpsock;
    int ret;
    char rbuf[100];
    pthread_t id;
    
    //定义ipv4地址体变量存放需要绑定的ip和端口号
    struct sockaddr_in bindaddr;
    bzero(&bindaddr,sizeof(bindaddr));
    bindaddr.sin_family=AF_INET;
    bindaddr.sin_addr.s_addr=inet_addr("193.168.1.150"); //女朋友(服务器)自己的ip
    bindaddr.sin_port=htons(20000); //女朋友(服务器)的端口号
    
    //定义ipv4地址体变量存放客户端的ip和端口号
    struct sockaddr_in boyaddr;
    int addrsize=sizeof(boyaddr);
    
    //创建tcp套接字
    tcpsock=socket(AF_INET,SOCK_STREAM,0);
    if(tcpsock==-1)
    {
        perror("创建tcp套接字失败!\n");
        return -1;
    }
    
    //绑定女朋友(服务器)自己的ip和端口号
    ret=bind(tcpsock,(struct sockaddr *)&bindaddr,sizeof(bindaddr));
    if(ret==-1)
    {
        perror("绑定ip端口失败了!\n");
        return -1;
    }
    
    //监听
    ret=listen(tcpsock,5);
    if(ret==-1)
    {
        perror("监听失败!\n");
        return -1;
    }
    printf("旧的套接字(监听套接字)是:%d\n",tcpsock);
    printf("服务器的代码阻塞在accept位置了!\n");
    //接收客户端的连接请求
    newsock=accept(tcpsock,(struct sockaddr *)&boyaddr,&addrsize);  
    if(newsock==-1)
    {
        perror("接收连接请求失败了!\n");
        return -1;
    }
    printf("有一个客户端连接成功了,产生的新套接字(已连接套接字)是:%d\n",newsock);
    
    //创建一个子线程专门发送信息
    pthread_create(&id,NULL,sendmsgtoclient,NULL);
    
    //主线程专门用来接收信息
    //循环接收客户端发送过来的内容
    while(1)
    {
        bzero(rbuf,100);
        //接收客户端发过来的信息
        read(newsock,rbuf,100);
        printf("客户端发送过来的内容是:%s\n",rbuf);
    }
    
    //关闭套接字
    close(tcpsock);
    close(newsock);
    return 0;
}


二、 客户端

2.1 客户端双向通信的详细流程

  1. 创建TCP套接字

    tcpsock = socket(AF_INET, SOCK_STREAM, 0);
    

    使用socket函数创建一个TCP套接字。

  2. 绑定客户端的IP和端口

    ret = bind(tcpsock, (struct sockaddr *)&bindaddr, sizeof(bindaddr));
    

    使用bind函数将套接字与客户端指定的IP地址和端口绑定。

  3. 连接到服务器

    ret = connect(tcpsock, (struct sockaddr *)&girladdr, sizeof(girladdr));
    

    使用connect函数连接到服务器。这里,客户端尝试连接到服务器的IP地址和端口。

  4. 创建接收消息的子线程

    pthread_create(&id, NULL, recvmsgfromserver, NULL);
    

    使用pthread_create函数创建一个新的线程,该线程专门用于接收从服务器发送过来的消息。

  5. 主线程发送消息

    write(tcpsock, sbuf, strlen(sbuf));
    

    主线程使用write函数发送从键盘输入的消息到服务器。

  6. 接收消息子线程

    void *recvmsgfromserver(void *arg)
    

    这是一个专用的线程任务函数,其主要工作是从服务器接收消息并在控制台上打印。

  7. 关闭套接字

    close(tcpsock);
    

    使用close函数关闭TCP套接字。

总结:此客户端程序的核心功能是创建一个TCP套接字并连接到服务器。一旦连接建立,它会启动一个子线程来接收从服务器发送过来的消息,而主线程则负责从键盘读取输入并将其发送到服务器。文章来源地址https://www.toymoban.com/news/detail-831713.html

2.2 客户端双向通信完整代码

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

/*
    多线程实现tcp双向通信
    客户端的代码
*/
int tcpsock;

//线程的任务函数--》专门接收服务器发送过来的信息
void *recvmsgfromserver(void *arg)
{
    char rbuf[100];
    while(1)
    {
        bzero(rbuf,100);
        read(tcpsock,rbuf,100);
        printf("服务器发过来的信息是:%s\n",rbuf);
    }
}
int main()
{
    
    int ret;
    char sbuf[100];
    pthread_t id;
    
    //定义ipv4地址体变量存放需要绑定的ip和端口号
    struct sockaddr_in bindaddr;
    bzero(&bindaddr,sizeof(bindaddr));
    bindaddr.sin_family=AF_INET;
    bindaddr.sin_addr.s_addr=inet_addr("192.168.1.140"); //客户端自己的ip
    bindaddr.sin_port=htons(10000); //客户端的端口号
    
    //定义ipv4地址体变量存放女朋友(服务器)的ip和端口号
    struct sockaddr_in girladdr;
    bzero(&girladdr,sizeof(girladdr));
    girladdr.sin_family=AF_INET;
    girladdr.sin_addr.s_addr=inet_addr("192.168.1.150"); //服务器的ip
    girladdr.sin_port=htons(20000); //服务器的端口号
    
    //创建tcp套接字
    tcpsock=socket(AF_INET,SOCK_STREAM,0);
    if(tcpsock==-1)
    {
        perror("创建tcp套接字失败!\n");
        return -1;
    }
    
    //绑定客户端自己的ip和端口号
    ret=bind(tcpsock,(struct sockaddr *)&bindaddr,sizeof(bindaddr));
    if(ret==-1)
    {
        perror("绑定ip端口失败了!\n");
        return -1;
    }
    
    //拨号连接服务器
    ret=connect(tcpsock,(struct sockaddr *)&girladdr,sizeof(girladdr));
    if(ret==-1)
    {
        perror("连接失败了!\n");
        return -1;
    }
    
    //创建一个子线程用来接收信息
    pthread_create(&id,NULL,recvmsgfromserver,NULL);
    
    //主线程用来发送信息
    //循环从键盘输入内容发送给服务器
    while(1)
    {
        bzero(sbuf,100);
        printf("请输入要发送给服务器的信息!\n");
        scanf("%s",sbuf);
        //发送给服务器
        write(tcpsock,sbuf,strlen(sbuf));
    }
    
    //关闭套接字
    close(tcpsock);
    return 0;
    
}

到了这里,关于GEC6818网络编程——服务器端与客户端tcp的双向通信的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 网络编程: 服务器百万连接实现

    实验内容: 用三个客户端与服务器建立百万连接 服务器代码: Reactor 将实验遇到的问题记录如下 一个TCP连接叫做TCP控制块(tcp control block)。区分网络连接的五元组元素有 添加功能 增加服务器监听端口 如果服务器只用一个端口,那么至少需要10e6/(2^16-1024) ≈ 16台虚拟机。(能分

    2024年01月20日
    浏览(49)
  • Java 网络编程 —— 创建多线程服务器

    一个典型的单线程服务器示例如下: 服务端接收到一个客户连接,就与客户进行通信,通信完毕后断开连接,然后接收下一个客户连接,假如同时有多个客户连接请求这些客户就必须排队等候。如果长时间让客户等待,就会使网站失去信誉,从而降低访问量。 一般用并发性

    2024年02月02日
    浏览(48)
  • 网络编程 lesson6 服务器模型和网络超时检测

    目录 服务器模型介绍 网络编程服务器模型 循环服务器模型 并发服务器模型 1. 多线程服务器 2. 多进程服务器 3. 事件驱动服务器 网络超时检测 应用场景 设置超时检测的方式 1.利用函数参数设置 代码示例 2.利用socket属性设置 3.利用alarm定时器设置 代码示例 在网络模型中,服

    2024年02月06日
    浏览(52)
  • 【skynet】 网络编程之回显服务器

    skynet 提供了一套 tcp 的 API ,本文将给出简单的回显服务器实现,以及讲解。 拉取 skynet 工程 编译 负责启动 gate 服务 \\\"L\\\" 表示客服端的消息前带四字节大端序的 msg_size skynet.address(skynet.self()) 把自己设置为 watchdog ,有新连接通过 text 消息告诉自己 port TCP 监听端口 0 将 TCP 数据

    2024年04月25日
    浏览(37)
  • linux并发服务器 —— linux网络编程(七)

    C/S结构 - 客户机/服务器;采用两层结构,服务器负责数据的管理,客户机负责完成与用户的交互;C/S结构中,服务器 - 后台服务,客户机 - 前台功能; 优点 1. 充分发挥客户端PC处理能力,先在客户端处理再提交服务器,响应速度快; 2. 操作界面好看,满足个性化需求; 3.

    2024年02月09日
    浏览(75)
  • 网络编程六--UDP服务器客户端

    UDP(User Datagram Protocol)称为用户数据报协议,是一种无连接的传输协议。 UDP的主要应用在即使丢失部分数据,也不影响整体效果的场景。例实时传输视频或音频时,即使丢失部分数据,也不会影响整体效果,只是会有轻微的画面抖动或杂音。 UDP服务器/客户端不像TCP那样,交

    2024年02月15日
    浏览(49)
  • 【网络编程】高性能并发服务器源码剖析

      hello !大家好呀! 欢迎大家来到我的网络编程系列之洪水网络攻击,在这篇文章中, 你将会学习到在网络编程中如何搭建一个高性能的并发服务器,并且我会给出源码进行剖析,以及手绘UML图来帮助大家来理解,希望能让大家更能了解网络编程技术!!! 希望这篇文章能

    2024年04月15日
    浏览(56)
  • 云服务器搭建与部署【Unity网络编程(一)】

    1.购买云服务器 新用户第一次买不贵,我在腾讯云买的,学生2G2核CPU20元3个月,36元半年,就买了半年的,只是简单的测试和学习 2.购买后建议选择CentOS系统,之前选择windows server系统,然后在XShell中一直连接不上 在服务器可以看到公网和内网了 3.重置密码 如果不重置的话登

    2023年04月20日
    浏览(43)
  • Linux学习之网络编程3(高并发服务器)

    Linux网络编程我是看视频学的,Linux网络编程,看完这个视频大概网络编程的基础差不多就掌握了。这个系列是我看这个Linux网络编程视频写的笔记总结。 问题: 根据上一个笔记,我们可以写出一个简单的服务端和客户端通信,但是我们发现一个问题——服务器只能连接一个

    2024年02月01日
    浏览(50)
  • 网络编程(8.14)TCP并发服务器模型

    作业: 1. 多线程中的newfd,能否修改成全局,不行,为什么? 2. 多线程中分支线程的newfd能否不另存,直接用指针间接访问主线程中的newfd,不行,为什么? 多线程并发服务器模型原代码: 1.将newfd改成全局变量效果:  答:不行,因为newfd是全局变量的话,客户端连接后生成

    2024年02月13日
    浏览(49)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包