Untitled

mail@pastecode.io avatarunknown
plain_text
24 days ago
2.0 kB
2
Indexable
Never
#include "tcp_client.h"
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <iostream>
#include <cstring>




const char* host = "127.0.0.1";
int port = 7000;


int getSockfd()
{
    static int sock_fd = start_client();
    return sock_fd;
}

//啟動並連接到伺服器
int start_client()
{
    int sock_fd;  //sock_fd 是客戶端的套接字描述符
    sockaddr_in serv_name; //sockaddr_in serv_name 存儲伺服器的地址資訊。

    int status;
    char indata[1024] = {0}, outdata[1024] = {0};

    // create a socket
    sock_fd = socket(AF_INET, SOCK_STREAM, 0);  //socket 函數用來創建一個新的套接字。 AF-INET -> IPv4, SOCK_STEAM-> TCP protocol

    if (sock_fd == -1) {
        perror("Socket creation error");
        exit(1);
    }

    // server address
    serv_name.sin_family = AF_INET;
    inet_aton(host, &serv_name.sin_addr); //inet_aton將字符串格式的IP地址(例如"127.0.0.1")轉換為二進制格式。
    serv_name.sin_port = htons(port);   // htons將主機字節序的端口號轉換為網絡字節序  
    
    //connect 函數用來連接到伺服器。伺服器的 IP 地址和端口號被硬編碼為 "127.0.0.1" 和 7000。
    status = connect(sock_fd, reinterpret_cast<struct sockaddr *>(&serv_name), sizeof(serv_name));
    if (status == -1) {
        perror("Connection error");
        exit(1);
    }
    
    //若成功,該函數返回套接字描述符,用於之後的通信。
    return sock_fd;

}


//此函數用來向已連接的伺服器發送數據。
int send_data(int sock_fd, const char *data)
{
    return send(sock_fd, data, strlen(data), 0);
}

//此函數用來從已連接的伺服器接收數據。
int receive_data(int sock_fd, char *buffer, int buffer_size)
{
    return recv(sock_fd, buffer, buffer_size, 0);
}

//此函數用來關閉與伺服器的連接。
void closed(int sock_fd)
{
    close(sock_fd);
}