tcp通信,客户端服务端

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

进行过程 

tcp客户端,Linux高薪,tcp/ip,服务器,网络

//TCP通信的流程

//服务器端(被动接受连接的角色)

1.创建一个用于监听的套接字

        -监听:监听有客户端的连接

        -套接字:这个套接字其实就是一个文件描述符

2.将这个监听文件描述符和本地的IP和端口绑定(IP和端口就是服务器的地址信息)

        -客户端连接服务器的时候使用的就是这个IP和端口

3.设置监听,监听的fd开始工作

4.阻塞等待,当有客户端发起连接,解除阻塞,接受客户端的连接,会得到一个和客户端通信的套接字(fd)

5.通信

        -接收数据

        -发送数据

6.通信结束,断开连接

//客户端

1.创建一个用于通信的套接字(fd)

2.连接服务器,需要指定连接的服务器和IP和端口

3.连接成功了,客户端可以直接和服务器端通信

             -接收数据

             -发送数据

4.通信结束,断开连接

 

字节序转换函数

发送端总是把要发送的数据转换成大端字节序数据后再发送,而接收端直到对方传送过来的数据总数采用大端字节序,所以接收端可以自身采用的字节序决定是否对接收到的数据进行转换(小端机转换,大端机不转换)

网络字节序采用大端

tcp客户端,Linux高薪,tcp/ip,服务器,网络 

 

IP地址转化

 比如用点分十进制字符串表示 IPv4 地址,以及用 十六进制字符串表示 IPv6 地址。但编程中我们需要先把它们转化为整数(二进制数)方能使用。而记录 日志时则相反,我们要把整数表示的 IP 地址转化为可读的字符串

tcp客户端,Linux高薪,tcp/ip,服务器,网络 

 

tcp/ip协议族

struct sockaddr_in
  {
    sa_family_t sin_family;     /*__SOCKADDR_COMMON (sin_)*/
    in_port_t sin_port;			/* Port number.  */
    struct in_addr sin_addr;		/* Internet address.  */

    /* Pad to size of `struct sockaddr'.  */
    unsigned char sin_zero[sizeof (struct sockaddr) -
			   __SOCKADDR_COMMON_SIZE -
			   sizeof (in_port_t) -
			   sizeof (struct in_addr)];
  };


struct in_addr
{
    in_addr_t s_addr;
};

 端口复用

tcp客户端,Linux高薪,tcp/ip,服务器,网络

 

 套接字函数

tcp客户端,Linux高薪,tcp/ip,服务器,网络

tcp客户端,Linux高薪,tcp/ip,服务器,网络 

 

 show me the Code

客户端代码

#include <stdio.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

using namespace std;

int main() {
    int fd = socket(AF_INET, SOCK_STREAM, 0);
    if (fd == -1) {perror("socket"); return -1;}

    struct sockaddr_in seaddr;
    inet_pton(AF_INET, "127.0.0.1",&seaddr.sin_addr.s_addr);
    seaddr.sin_family = AF_INET;
    seaddr.sin_port = htons(9999);
    int ret = connect(fd, (struct sockaddr*)&seaddr,sizeof(seaddr));    
    if (ret == -1) {perror("connect"); return -1;}

    while(1) {
        char sendBuf[1024] = {0};
        fgets(sendBuf, sizeof(sendBuf), stdin);

        write(fd, sendBuf, strlen(sendBuf) + 1);

        //接收
        int len = read(fd, sendBuf, sizeof(sendBuf));
        if (len==-1) {
            perror("read");
            return -1;
        }else if(len > 1) {
            printf("read buf = %s\n", sendBuf);
        }else {
            printf("服务器已经断开连……\n");
            break;
        }
    }

    close(fd);
    return 0;


    return 0;
}

服务端代码

#include <stdio.h>
#include <ctype.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>

int main() {
    //创建socket
    int lfd = socket(AF_INET, SOCK_STREAM, 0);
    if (lfd == -1) {
        perror("socket");
        return -1;
    }

    struct sockaddr_in seraddr;
    seraddr.sin_family = AF_INET;
    seraddr.sin_addr.s_addr = INADDR_ANY;
    seraddr.sin_port = htons(9999);

    //端口复用,防止服务器重启时之前绑定的端口还没有释放
    //程序突然退出而系统没有释放端口
    int optval = 1;
    setsockopt(lfd, SOL_SOCKET, SO_REUSEPORT, &optval, sizeof(optval));
    
    //绑定
    int ret = bind(lfd, (struct sockaddr*)&seraddr, sizeof(seraddr));
    if(ret == -1) {
        perror("bind");
        return -1;
    }

    //监听
    ret = listen(lfd, 8);
    if(ret == -1) {
        perror("listen");
        return -1;
    }

    //接收客户端连接
    struct sockaddr_in cliaddr;
    socklen_t len = sizeof(cliaddr);
    int cfd = accept(lfd, (struct sockaddr*)&cliaddr, &len);
    if(cfd == -1) {
        perror("accept");
        return -1;
    }

    //获取客户端信息
    char clilp[16];
    inet_ntop(AF_INET, &cliaddr.sin_addr.s_addr, clilp, sizeof(clilp));
    int cliPort = ntohs(cliaddr.sin_port);
    //printf("client's ip is%s, ans port is %d\n", clilp, cliPort);

    //接收客户端发来的数据
    char recvBuf[1024] = {0};
    while(1) {
        int len = recv(cfd, recvBuf, sizeof(recvBuf), 0);
        if(len == -1) {
            perror("recv");
            return -1;
        }else if(len == 0) {
            printf("客户端已经断开连接……\n");
            break;
        }else if(len > 0) {
            printf("read buf = %s\n", recvBuf);
        }

        char sendBuf[1024] = {0};
        fgets(sendBuf, sizeof(sendBuf), stdin);

        //大写字符串发送给客户端
        ret = send(cfd, sendBuf, strlen(sendBuf) + 1, 0);
        if(ret == -1) {
            perror("send");
            return -1;
        }
    }

    close(cfd);
    close(lfd);
    return 0;
}

在linux编译即可

g++  客户端.cpp -o a.out

g++  服务端.cpp -o b.out文章来源地址https://www.toymoban.com/news/detail-703235.html

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

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

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

相关文章

  • Linux下TCP网络服务器与客户端通信程序入门

    实现客户端连接服务器,通过终端窗口发送信息给服务器端,服务器接收到信息后对信息数据进行回传,客户端读取回传信息并返回。 服务器当前IP地址要知道 建立socket 绑定本地IP地址并设置端口号 知道服务器的IP地址和端口号 然后进行连接

    2024年02月14日
    浏览(62)
  • Linux网络编程:socket、客户端服务器端使用socket通信(TCP)

    socket(套接字),用于网络中不同主机间进程的通信。 socket是一个伪文件,包含读缓冲区、写缓冲区。 socket必须成对出现。 socket可以建立主机进程间的通信,但需要协议(IPV4、IPV6等)、port端口、IP地址。          (1)创建流式socket套接字。                 a)此s

    2024年02月11日
    浏览(65)
  • tcp通信,客户端服务端

    //TCP通信的流程 //服务器端(被动接受连接的角色) 1.创建一个用于监听的套接字         -监听:监听有客户端的连接         -套接字:这个套接字其实就是一个文件描述符 2.将这个监听文件描述符和本地的IP和端口绑定(IP和端口就是服务器的地址信息)         -客户端

    2024年02月09日
    浏览(35)
  • TCP实现服务器和客户端通信

    目录 TCP介绍 代码实现 server(服务器端) 代码分析 client(客户端) 代码分析 结果展示 TCP (Transmission Control Protocol) 是一种面向连接的协议,用于在计算机网络中传输数据。TCP 可以确保数据的可靠传输,即使在网络环境不稳定的情况下也能够保证数据的完整性和顺序。以下是

    2024年02月15日
    浏览(62)
  • 简易TCP客户端和服务器端通信

    #includeiostream #include winsock2.h   #include ws2tcpip.h   #includestdlib.h using namespace std; #define  BUF_SIZE  1024 int main() {     cout \\\"客户端\\\" endl;     //设置Winsock版本,     WSADATA   wsaData;     if (WSAStartup(MAKEWORD(2, 2), wsaData) != 0)     {         cout \\\"error\\\" endl;         exit(1);     }     //创建通

    2024年04月29日
    浏览(49)
  • QTday05(TCP的服务端客户端通信)

    pro文件需要导入  network 头文件: widget.cpp ui: 头文件 widget.cpp ui: 运行结果:客户端连接之后可以成功发送信息 今日思维导图: 代码: page2.h: widget.h: main.cpp: page2.cpp: widget.cpp: page2.ui: widget.ui: 运行结果:

    2024年02月07日
    浏览(38)
  • TCP通信实现客户端向服务器发送图片

    TCP通信: 1. TCP 协议通信交互流程: 具体的流程如下: (1)服务器根据地址类型(ipv4、ipv6)、socket 类型、协议创建 socket. (2)服务器为 socket 绑定 ip 地址和端口号。 (3)服务器 socket 监听端口号的请求,随时准备接受来自客户端的连接,此时服务器的 socket 处于关闭状态

    2024年02月13日
    浏览(59)
  • Golang TCP/IP服务器/客户端应用程序,设计一个简单可靠帧传送通信协议。(并且正确处理基于流式控制协议,带来的应用层沾帧[沾包]问题)

    在 Golang 语言标准库之中提供了,对于TCP/IP链接、侦听器的高级封装支持,这易于上层开发人员轻松基于这些BCL(基础类库)实现期望的功能。 TCP/IP链接(客户端) net.Conn 接口 TCP/IP侦听器(服务器) net.Listener Golang 提供了易用的写入数据到远程(对端)实现,而不比像 C/C

    2024年01月24日
    浏览(64)
  • QT实现TCP通信(服务器与客户端搭建)

    创建一个QTcpServer类对象,该类对象就是一个服务器 调用listen函数将该对象设置为被动监听状态,监听时,可以监听指定的ip地址,也可以监听所有主机地址,可以通过指定端口号,也可以让服务器自动选择 当有客户端发来连接请求时,该服务器会自动发射一个newConnection信号

    2024年02月09日
    浏览(56)
  • Java实现TCP客户端和服务器端相互通信

    解决TCP客户端和服务器端通信读不到数据的问题  解决: 服务器端和客户端读完后加上client.shutdownInput(); 服务器端和客户端写完后加上client.shutdownOutput(); 服务器端代码: 客户端代码: 运行服务器端再运行客户端,在客户端中输入要发送的信息,回车 服务器收到信息,over

    2024年02月08日
    浏览(59)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包