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;
// }

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值