tcp 简易 demo

1、客户端

1.1 头文件 tcp_client.h

#ifndef UNTITLED_TCP_CLIENT_H
#define UNTITLED_TCP_CLIENT_H
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <string.h>
#include <sys/stat.h>
#include <fcntl.h>

class TcpLient
{
public:
    TcpLient(){};

    void clientSend(int argc, char* argv[]);
private:
    int clientSocket;

};

#endif //UNTITLED_TCP_CLIENT_H

1.2 cpp文件 tcp_client.cpp


#include "tcp_client.h"

void TcpLient::clientSend(int argc, char* argv[])
{
    //1 create socket param1:
    clientSocket = socket(AF_INET, SOCK_STREAM, 0);
    if(-1 == clientSocket) printf("create socket error: %m\n"), exit(-1);
    printf("create socket sucess !\n");


    //2 create server agreement adresses
    struct sockaddr_in cAddr = {0};
    cAddr.sin_family = AF_INET;
    cAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
    cAddr.sin_port = htons(9527);

    //3 connect server
    int r  = connect(clientSocket, (struct sockaddr*)&cAddr, sizeof cAddr);
    if(-1 == r) printf("connect server is faile :%m ]\n"), close(clientSocket), exit(-2);
    printf("connect server is sucess! \n");

    // 4 communication
    //4.1 open file
    int fd = open(argv[1],O_RDONLY, 0666);
    if(-1 == fd) printf("open file faile:%m\n"), close(clientSocket), exit(-3);
    printf("open file sucess!\n");

    //4.2 get file size
    struct stat st = {0};
    stat(argv[1], &st);
    printf(" the file size : %d\n", (int)st.st_size);
    printf(" the file name : %s\n",argv[1]);

    sleep(2);
    //4.3 send file name and file size to server
    send(clientSocket, argv[1], strlen(argv[1]), 0);
    sleep(2);
    send(clientSocket, (char*)&st.st_size, 4,0);

    //4.4 read file' data and send
    sleep(2);
    char buff[1024] = {0};
    while(1)
    {
        r = read(fd, buff, 1024);
        if(r > 0)
            send(clientSocket, buff, r, 0);
        else
            break;
    }

    //5 close file
    sleep(1);
    close(fd);
    close(clientSocket);
    printf("send file is over!\n");

}

2、服务端

2.1 头文件 tcp_server.h

#ifndef UNTITLED_TCP_SERVER_H
#define UNTITLED_TCP_SERVER_H

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <string.h>
#include <signal.h>
#include <fcntl.h>

class tcp_server
{
public:
    tcp_server(){};
    void hand(int val);
    void serverRecive(int argc, char* argv[]);


private:
    int serverSocket,clientSocket;
};
#endif //UNTITLED_TCP_SERVER_H

2.2 cpp文件 tcp_server.cpp

#include "tcp_server.h"

void tcp_server::serverRecive(int argc, char* argv[])
{
    //1 create socket param1:
    serverSocket = socket(AF_INET, SOCK_STREAM, 0);
    if(-1 == serverSocket) printf("create socket error: %m\n"), exit(-1);
    printf("create socket sucess !\n");


    //2 create server agreement adresses
    struct sockaddr_in sAddr = {0};
    sAddr.sin_family = AF_INET;
    sAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
    sAddr.sin_port = htons(9527);

    //3 binding
    int r = bind(serverSocket, (struct sockaddr*)&sAddr, sizeof sAddr);
    if(-1 == r) printf("binding is faile :%m ]\n"), close(serverSocket), exit(-2);
    printf("binding is sucess! \n");

    //4 listen
    r = listen(serverSocket, 10);
    if(-1 == r) printf("listening is faile:%m \n"), close(serverSocket), exit(-2);
    printf(" listening is sucess \n");

    // 5 wait client connect
    struct sockaddr_in cAddr = {0};
    socklen_t len = sizeof(cAddr);
    clientSocket = accept(serverSocket, (struct sockaddr*)&cAddr, &len);
    if(-1 == clientSocket) printf(" server is bad: %m\n"), close(serverSocket), exit(-3);
    printf("there is some clients have connect:%s\n", inet_ntoa((cAddr.sin_addr)));


    //6 communication
    char fileName[256] = {0};
    int fileSize = 0;
    char buff[1024] = {0};
    int fileCount; // count the size of writing to file

    sleep(2);
    //6.1 recive file's name
    r = recv(clientSocket, fileName, 255, 0);
    if(r >  0)
    {
        printf(">>>>>>>>>%d\n", r);
        printf("recive file's name: %s\n", fileName);
    }


    sleep(2);
    //6.2 recive file's size
    r = recv(clientSocket, (int*)&fileSize, 4, 0);
    if(r == 4)
    {
        printf("the size of file is :%d\n", r);
        printf("recive the size of file is :%d\n", fileSize);
    }

    //6.3 create file
    int fd = open(fileName, O_CREAT | O_WRONLY, 0666);
    if(-1 == fd) printf("create file is faile!:%m\n"), close(clientSocket), close(serverSocket), exit(-4);

    sleep(2);
    //6.4 write to file from recive dat
    while(1)
    {
        r = recv(clientSocket,buff, 1024, 0);
        if(r > 0)
        {
            write(fd, buff, r);
            fileCount +=  r;
            if(fileCount >= fileSize)
                break;
        }

    }

    //7 close file and connect
    sleep(1);
    close(fd);
    close(serverSocket);
    close(serverSocket);
    printf("file recive is over!\n");
}

void tcp_server::hand(int val)
{
    //7 close connect
    close(serverSocket);
    printf("bye! \n");
    exit(0);
}

3、mian函数

 #include "tcp_server.h"
 #include "tcp_client.h"

 int main(int argc, char* argv[])
 {
     printf("%d\n",argc);
     if(argc == 1)
     {
         tcp_server server;
         server.serverRecive(argc,argv);
     }
     else
     {
         TcpLient client;
         client.clientSend(argc,argv);
     }

//     return 0;
// }

### 回答1: TCP通信demo是指基于TCP协议实现的通信示例程序。TCP协议是一种可靠的、面向连接的传输层协议,它的主要特点是在通信双方建立连接后,可保证数据的完整性、有序性和可靠性,在数据传输过程中还可以进行流量控制和拥塞控制,因此在网络传输中得到广泛的应用。 在实现TCP通信demo的过程中,需要注意以下几个方面: 1.连接建立:在TCP协议中,连接的建立需要经过三次握手的过程,即发送SYN报文、收到SYN+ACK报文、发送ACK报文。因此,在demo中需要实现连接建立的过程,并保证建立成功后才能进行数据传输。 2.数据传输:在TCP协议中,数据是分段传输的,每个数据包都有一个序号和确认序号。因此,在demo中需要实现数据的分段传输和接收,并进行序号和确认序号的匹配。 3.流量控制和拥塞控制:在TCP协议中,为了避免网络拥塞导致数据传输的失败,需要进行流量控制和拥塞控制。在demo中可以实现简单的流量控制和拥塞控制,例如设置最大传输速度和传输窗口大小。 总之,TCP通信demo是一个重要的网络编程示例程序,它可以帮助我们了解TCP协议的工作原理和应用场景,提高我们的网络编程技能和调试能力。 ### 回答2: TCP通信是计算机网络中重要的传输层协议,用于在两个设备之间提供可靠的数据传输。编写一个TCP通信的demo是帮助理解TCP协议及其应用的一种方式。以下是一份简单的TCP通信demo的说明: 该demo包含两个客户端和一个服务器端。客户端向服务器发送数据,服务器接收数据并返回响应。客户端与服务器之间通过一个连接在TCP协议下进行通信。客户端通过套接字socket()函数创建一个套接字,并使用connect()函数连接到服务器。服务器端也使用socket()函数创建套接字,并调用bind()函数绑定端口号,然后使用listen()函数开启监听模式。当客户端连接到服务器后,服务器端使用accept()函数接受连接请求,然后使用recv()函数接收客户端发送的数据,并使用send()函数发送响应。客户端通过send()函数发送数据,并使用recv()函数接收服务器端的响应。 在编写TCP通信demo时需要注意以下事项: 1. 客户端和服务器端需使用相同的协议族(如IPv4或IPv6)和协议类型(如TCP或UDP)。 2. 确定通信过程中所需的数据格式,并在客户端和服务器端之间使用相同的格式传输数据。 3. 需要注意TCP协议中的粘包问题,即多个数据包可能会被合并在一起,需要使用固定长度或特殊分隔符来区分数据包。 4. 在处理网络异常情况时,应考虑超时、连接失效等问题,并进行相应的异常处理。 通过编写TCP通信demo,可以更加深入理解TCP协议的工作原理和应用,加强网络编程的基本功。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值