Untitled
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); }