Linux 下使用 socket 实现 TCP 客户端

简介: Linux 下使用 socket 实现 TCP 客户端

套接字(socket)是 Linux 下的一种进程间通信机制(socket IPC),它不仅支持同一主机的不同进程间通信,还支持跨网络的不同主机的进程间通信。


socket 允许通过标准的文件描述符进行网络数据传输,支持各种网络协议,如 TCP 和 UDP,它把复杂的 TCP/IP 协议隐藏在 socket 接口下,对用户来说,一组简单的接口就是全部,让 socket 去组织数据,以符合指定的协议。


基于 socket 接口编写的应用程序可以移植到任何实现 BSD socket 标准的平台。本文介绍了 Linux 下使用 socket 接口实现 TCP 客户端的示例程序。


开发环境:虚拟机 Ubuntu 18.04

验证平台:正点原子 Mini Linux 开发板

服务端:网络调试助手 NetAssist


示例代码

  • tcp_client.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/tcp.h>
 
#include "tcp_client.h"

int client_init_socket(void)
{
    int socket_fd;
    struct sockaddr_in server_address;

    if ((socket_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) 
    {
        perror("socket failed");
        exit(EXIT_FAILURE);
    }

    server_address.sin_family = AF_INET;
    server_address.sin_addr.s_addr = inet_addr(SERVER_IP);
    server_address.sin_port = htons(SERVER_PORT);

    if (connect(socket_fd, (struct sockaddr *)&server_address, sizeof(server_address)) < 0) 
    {
        perror("connect");
        exit(EXIT_FAILURE);
    }

    return socket_fd;
}

int client_receive_data(int socket_fd, char *message, ssize_t *size) 
{
    ssize_t bytes_received = recv(socket_fd, message, BUFFER_SIZE, 0);
    if (bytes_received == -1) 
    {
        perror("recv");
        exit(EXIT_FAILURE);
    }
    *size = bytes_received;
    return 0;
}

void client_send_data(int socket_fd, const char *message, ssize_t size) 
{
    if (send(socket_fd, message, size, 0) < 0) 
    {
        perror("send");
        exit(EXIT_FAILURE);
    }
}

int client_check_tcp_connection(int socket_fd) 
{
    int error = 0;
    socklen_t len = sizeof(error);
    if (getsockopt(socket_fd, SOL_SOCKET, SO_ERROR, &error, &len) == 0) 
    {
        if (error == 0) 
        {
            return 1;
        }
    }
    return 0;
}

int client_close_socket(int socket_fd)
{
    close(socket_fd);
    return 0;
}
  • tcp_client.h
#ifndef __TCP_CLIENT_H__
#define __TCP_CLIENT_H__

#include <sys/socket.h>

#define SERVER_IP "192.168.0.120"
#define SERVER_PORT 8080
#define BUFFER_SIZE 1024

int client_init_socket(void);
int client_receive_data(int socket_fd, char *message, ssize_t *size);
void client_send_data(int socket_fd, const char *message, ssize_t size);
int client_check_tcp_connection(int socket_fd);
int client_close_socket(int socket_fd);

#endif


  • main.c
#include <stdio.h>
#include "tcp_client.h"

int main(void)
{
    int client_fd = 0;
    char buffer[1024] = {0};
    ssize_t size = 0;
    
    client_fd = client_init_socket();

    client_send_data(client_fd, "Hello Server!", 13);

    client_receive_data(client_fd, buffer, &size);
    printf("%s \r\n", buffer);
    
    client_close_socket(client_fd);

    return 0;
}


板级验证

  • 打开网络调试助手,设置为 TCP 服务端,选择本地主机地址和端口,点击打开:


  • 代码中配置服务端 IP 与端口号,通过交叉编译生成目标程序,拷贝到 Elfboard Linux 开发板上:
#define SERVER_IP "192.168.221.1"
#define SERVER_PORT 8080
  • 运行客户端程序

  • 服务端显示客户端已连接,并接收到客户端消息:

  • 服务端向客户端回复消息:


  • 客户端接收到服务端消息:

更多内容

  • CSDN博客:@Hello阿尔法
  • 哔哩哔哩:@Hello阿尔法
  • 知乎:@Hello阿尔法
相关文章
|
19天前
|
存储 算法 Linux
【实战项目】网络编程:在Linux环境下基于opencv和socket的人脸识别系统--C++实现
【实战项目】网络编程:在Linux环境下基于opencv和socket的人脸识别系统--C++实现
42 6
|
6天前
|
存储 网络协议 关系型数据库
Python从入门到精通:2.3.2数据库操作与网络编程——学习socket编程,实现简单的TCP/UDP通信
Python从入门到精通:2.3.2数据库操作与网络编程——学习socket编程,实现简单的TCP/UDP通信
|
12天前
|
网络协议 Linux Windows
TCP/IP、Http、Socket之间的区别
TCP/IP、Http、Socket之间的区别
|
15天前
|
网络协议 Ubuntu Unix
Linux 下使用 socket 实现 TCP 服务端
Linux 下使用 socket 实现 TCP 服务端
|
16天前
|
安全 程序员
|
19天前
|
安全 Java 数据处理
Python网络编程基础(Socket编程)多线程/多进程服务器编程
【4月更文挑战第11天】在网络编程中,随着客户端数量的增加,服务器的处理能力成为了一个重要的考量因素。为了处理多个客户端的并发请求,我们通常需要采用多线程或多进程的方式。在本章中,我们将探讨多线程/多进程服务器编程的概念,并通过一个多线程服务器的示例来演示其实现。
|
19天前
|
程序员 开发者 Python
Python网络编程基础(Socket编程) 错误处理和异常处理的最佳实践
【4月更文挑战第11天】在网络编程中,错误处理和异常管理不仅是为了程序的健壮性,也是为了提供清晰的用户反馈以及优雅的故障恢复。在前面的章节中,我们讨论了如何使用`try-except`语句来处理网络错误。现在,我们将深入探讨错误处理和异常处理的最佳实践。
|
24天前
|
网络协议 程序员 Python
pythonTCP客户端编程创建Socket对象
【4月更文挑战第6天】本教程介绍了TCP客户端如何创建Socket对象。Socket作为网络通信的基础单元,包含协议、IP地址和端口等信息。在TCP/IP中,Socket分为流式(TCP)、数据报(UDP)和原始套接字。以Python为例,创建TCP Socket对象需调用`socket.socket(AF_INET, SOCK_STREAM)`。为确保健壮性,应使用异常处理处理可能的`socket.error`。学习本教程将帮助你掌握TCP客户端创建Socket对象的技能。
|
2月前
|
网络协议 安全 API
计算机网络之Socket编程
计算机网络之Socket编程
|
3月前
|
网络协议 安全 开发者
Python 中的 Socket 编程
Python 中的 Socket 编程
44 4