socket实现tcp通信

这篇具有很好参考价值的文章主要介绍了socket实现tcp通信。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

tcp的接口

tcp的详细细节后面讲解,先来用它的一些接口实现1个简单的通信。下面来看它的一套接口

socket

功能:socket()打开一个网络通讯端口,如果成功的话,就像open()一样返回一个文件描述符;应用程序可以像读写文件一样用read/write在网络上收发数据;

函数原型:

  int socket(int domain, int type, int protocol);

参数说明:

  • domain:协议域又称协议家族,协议族决定了socket的地址类型,跟udp的一样,用IPv4还是AF_INET
  • type:套接字类别,有流式套接字和数据报套接字,tcp用的是面向流的传输协议,参数为SOCK_STREAM
  • protocol:协议指定与套接字一起使用的特定协议,指定为0即可

返回值:

成功则返回socket文件描述符,错误返回-1.

socket接口在上一篇的udp中已经有了,这里不做多余的讲解。

bind

服务器程序所监听的网络地址和端口号通常是固定不变的,客户端程序得知服务器程序的地址和端口号后就可以向服务器发起连接; 服务器需要调用bind绑定一个固定的网络地址和端口号.

函数原型:

int bind(int socket, const struct sockaddr *address,socklen_t address_len);

参数说明:

  • socket:需要绑定的socket
  • addr:存放了服务端用于通信的地址和端口。
  • addrlen:表示addr结构体的大小。

返回值:

  • 成功返回0,失败返回-1

前面的这2个接口的使用跟udp是一样的。

listen监听

listen声明sockfd处于监听状态, 并且最多允许有backlog个客户端处于连接等待状态, 如果接收到更多
的连接请求就忽略, 这里设置不会太大(一般是5)。udp完成bind后就可以接收和发送信息了,tcp在这里就跟它不同了。为什么要监听呢?因为服务器要知道从客户端发来了请求。
就像在公司的食堂吃饭一样,我们上面时候去都能吃到饭,因为食堂的打饭人员一看到人来就知道有人来吃饭了。这个打饭人员就是处于监听状态,我们吃饭就是客户端的请求。

函数原型:

int listen(int sockfd, int backlog);

参数说明:

  • sockfd:监听的套接字
  • backlog:最多允许有多个客户端处于连接等待状态

返回值:成功返回0,失败返回-1

accept

服务器需要接收客户端的请求,如果服务器调用accept()时还没有客户端的连接请求,就阻塞等待直到有客户端连接上来。
函数原型:

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

参数说明:

  • sockfd:要连接的套接字
  • addr:是一个传出参数,accept()返回时传出客户端的地址和端口号;
  • addrlen:参数是一个传入传出参数(value-result argument), 传入的是调用者提供的, 缓冲区addr的长度以避免缓冲区溢出问题, 传出的是客户端地址结构体的实际长度(有可能没有占满调用者提供的缓冲区)

返回值:(重点理解返回值)

成功返回新的套接字,失败返回-1

socket实现tcp通信

为什么返回1个套接字?

来看个例子:
socket实现tcp通信
这个accept的返回值就是这个服务员,sockfd就是这个拉客的,吃饭的人就是客户端发来的请求。
这个拉客的把人带给服务员后,她有继续出去拉客了。sockfd这个套接字继续拉客也就是继续从底层获取客户端的链接,服务员专门处理链接也就是返回的这个套接字,专门处理和用户沟通。

connect

我们的客户端需要调用connet来连接服务器。
函数原型:

int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);

参数说明:
connect和bind的参数形式一致, 区别在于bind的参数是自己的地址, 而connect的参数是对方的地址;
connect()成功返回0,出错返回-1

recv

功能接收数据。
函数原型:

 ssize_t recv(int sockfd, void *buf, size_t len, int flags);

参数说明:

  • sockfd:指定接收端套接字描述符
  • buf:指明一个缓冲区,该缓冲区用来存放recv函数接收到的数据;
  • len:指明buf的长度
  • flags:参数一般置0

返回值:
成功则返回读出来的大小,失败返回-1.

send

功能发送信息,函数原型

ssize_t send(int sockfd, const void *buf, size_t len, int flags);

参数说明:

  • sockfd:指定发送端套接字描述符
  • buf:指明一个存放应用程序要发送数据的缓冲区;
  • len:指明实际要发送的数据的字节数;
  • flags:参数一般置0。

单进程版tcp通信

下面来利用上面的接口来写个简单服务器和客户端来实现通信,首先是单进程版的。

服务器

整体逻辑:

  • 首先初始化服务器,初始化服务器包括:先创建套接字,创建好后开始绑定,若绑定失败,则直接退出进程。绑定好后开始监听套接字,监听失败也直接退出。
  • 启动服务器:监听成功后,先接收客户端发来的信息,再给客户端发送echo server服务器。

tcpServer.hpp文章来源地址https://www.toymoban.com/news/detail-429233.html

  1 #pragma once                                                                                                                        
  2 #include<iostream>
  3 #include<cstdio>
  4 #include<stdlib.h>
  5 #include<cstring>
  6 #include<unistd.h>
  7 #include<sys/types.h>
  8 #include<sys/socket.h>
  9 #include<arpa/inet.h>
 10 #include<netinet/in.h>
 11 #define BACKLOG 5
 12 class tcpServer
 13 {
   
 14   private:
 15     int port;
 16     int lsock;
 17   public:
 18   tcpServer(int _port = 8080)
 19     :port(_port)
 20     ,lsock(-1)
 21   {
   }
 22  void initServer()
 23  {
   
 24     lsock = socket(AF_INET,SOCK_STREAM,0);
 25     struct sockaddr_in local;
 26     local.sin_family = AF_INET;//IPv4
 27     local.sin_port = htons(port);//端口号,主机序列转成网络序列
 28     local.sin_addr.s_addr = INADDR_ANY;//ip地址
 29 
 30     //开始绑定
 31     if(bind(lsock,(struct sockaddr*)&local

到了这里,关于socket实现tcp通信的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Linux系统c语言socket实现TCP通信

    Linux系统c语言socket实现TCP通信

    socket通信用到的函数 sockaddr_in结构体(在netinet/in.h中定义) 对于服务端 使用socket()创建套接字socket 使用bind()将创建的套接字绑定到一个本地地址和端口上 listen()将套接字设为监听模式,准备接收客户端请求 accept()接收连接请求,返回一个对应于此次连接的新的套接字 read()

    2024年02月05日
    浏览(6)
  • 使用 python socket 实现UDP/TCP网络通信

    使用 python socket 实现UDP/TCP网络通信

    目录 目录 1.socket简介 2.创建socket 2.1创建UDPSocket 2.2创建TCPSocket 3.使用UDPSocket发送数据并接收 4.使用UDPSocket发送广播 5.UDPSocket聊天器 (多线程实现消息的收发功能) 6.使用TCPSocket建立客户端 7.使用TCPSocket建立服务端        socket(简称:套接字),是支持TCP和UDP(网络传输方式

    2023年04月10日
    浏览(7)
  • 基于 Socket 接口实现自定义协议通信

    基于 Socket 接口实现自定义协议通信

    访问【WRITE-BUG数字空间】_[内附完整源码和文档] 根据自定义的协议规范,使用 Socket 编程接口编写基本的网络应用软件。 掌握 C 语言形式的 Socket 编程接口用法,能够正确发送和接收网络数据包 开发一个客户端,实现人机交互界面和与服务器的通信 开发一个服务端,实现并

    2024年02月06日
    浏览(7)
  • Socket套接字编程(实现TCP和UDP的通信)

    Socket套接字编程(实现TCP和UDP的通信)

      🎉🎉🎉点进来你就是我的人了 博主主页:🙈🙈🙈戳一戳,欢迎大佬指点! 人生格言: 当你的才华撑不起你的野心的时候,你就应该静下心来学习! 欢迎志同道合的朋友一起加油喔 🦾🦾🦾 目标梦想:进大厂,立志成为一个牛掰的Java程序猿,虽然现在还是一个🐒嘿嘿 谢谢

    2024年02月03日
    浏览(7)
  • 【Unity】Socket网络通信(TCP) - 实现简单的多人聊天功能

    【Unity】Socket网络通信(TCP) - 实现简单的多人聊天功能

    多客户端连接服务器其原理是在服务端保存客户端连入后与客户端通信的socket,由于等待客户端连接会阻塞主线程,所以结合多线程就能实现多客户端连入功能。多人聊天只需要将A客户端发来的消息,转发给除A客户端外的其他客户端,即可实现。如果你还不怎么熟悉服务端

    2024年02月03日
    浏览(16)
  • socket概述 python中如何使用TCP/UDP协议实现通信-教程

    socket概述 python中如何使用TCP/UDP协议实现通信-教程

    很多编程语言中,都 使用scoket套接字实现网络通信。 Socket是对TCP/IP协议的封装,Socket本身就是一个调用接口(API),方便程序员用Socket使用TCP/IP协议簇,实现网络通信。 不同编程语言,shiyongSocket通信的语法有所区别,但基本原理类型相似。 它的两种方式,分别是TCP和UDP协

    2024年02月13日
    浏览(8)
  • Java实现socket通信详解(UDP/TCP)c/s模式

    Java实现socket通信详解(UDP/TCP)c/s模式

    在实现具体代码前,我们先来简单了解下TCP/UDP协议 TCP在OSI模型中位于传输层在网络层之上,故在端到端传输的基础上将数据以端口号等标识实现进程/终端设备应用的区分, 将数据精准的传达。 TCP全称为传输控制协议具有以下特点: 面向有连接的服务可靠的数据传输,即在

    2023年04月08日
    浏览(3)
  • Socket网络编程(TCP/IP)实现服务器/客户端通信。

    Socket网络编程(TCP/IP)实现服务器/客户端通信。

    一.前言 回顾之前进程间通信(无名管道,有名管道,消息队列,共享内存,信号,信号量),都是在同一主机由内核来完成的通信。 那不同主机间该怎么通信呢? 可以使用Socket编程来实现。 Socket编程可以通过网络来实现实现不同主机之间的通讯。 二.Socket编程的网络模型如

    2024年02月08日
    浏览(12)
  • Socket编程接口API并实现简单的TCP网络编程

    Socket编程接口API并实现简单的TCP网络编程

    #include sys/types.h #include sys/socket.h socket()创建套接字,成功返回套接字的文件描述符,失败返回-1 domain: 设置套接字的协议簇, AF_UNIX AF_INET AF_INET6 type: 设置套接字的服务类型 SOCK_STREAM SOCK_DGRAM protocol: 一般设置为 0,表示使用默认协议 int socket(int domain, int type, int protocol); bind()将

    2024年02月13日
    浏览(12)
  • JAVA Socket实现实时接收TCP消息,让你的服务端通信更高效!

    JAVA Socket实现实时接收TCP消息,让你的服务端通信更高效!

    本文主要介绍如何利用socket实现实时接收服务端发送的TCP消息。 目录 一、需要掌握 二、程序源码 三、运行演示 网络调试助手下载:https://www.aliyundrive.com/s/6Y8L7Wv5sT6 网络通信协议的理解:JAVA socket是基于TCP/IP协议实现的,需要对TCP/IP协议有一定的了解,包括TCP连接的建立、数

    2024年02月11日
    浏览(6)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包