Linux下使用使用socket实现TCP服务端的示例代码

 更新时间:2024年03月18日 09:41:29   作者:Hello阿尔法  
套接字(socket)是 Linux 下的一种进程间通信机制(socket IPC),它不仅支持同一主机的不同进程间通信,还支持跨网络的不同主机的进程间通信,本文介绍了 Linux 下使用 socket 接口实现 TCP 服务端的示例程序,需要的朋友可以参考下

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

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

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

  • 开发环境:虚拟机 Ubuntu 18.04
  • 验证平台:Elfboard Linux 开发板
  • 客户端:Windows 网络调试助手 NetAssist

示例代码

  • tcp_server.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 <errno.h>
#include "tcp_server.h"

int server_init_socket(void) 
{
    int socket_fd;
    struct sockaddr_in address;

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

    address.sin_family = AF_INET;
    address.sin_addr.s_addr = INADDR_ANY;
    address.sin_port = htons(PORT);

    if (bind(socket_fd, (struct sockaddr *)&address, sizeof(address)) < 0) 
    {
        perror("bind failed");
        exit(EXIT_FAILURE);
    }

    if (listen(socket_fd, 3) < 0) 
    {
        perror("listen");
        exit(EXIT_FAILURE);
    }

    return socket_fd;
}

int server_set_socket_timeout(int socket_fd, long milliseconds)
{
    struct timeval tv;

    tv.tv_sec =  milliseconds / 1000; 
    tv.tv_usec = (milliseconds % 1000) * 1000;

    if (setsockopt(socket_fd, SOL_SOCKET, SO_RCVTIMEO, (const char*)&tv, sizeof(tv)) < 0) 
    {
        perror("setsockopt SO_RCVTIMEO");
        exit(EXIT_FAILURE);
    }

    return 0;
}

int server_accept_client(int socket_fd) 
{
    struct sockaddr_in address;
    int addrlen = sizeof(address);
    int temp_fd = accept(socket_fd, (struct sockaddr *)&address, 
                                            (socklen_t*)&addrlen);
    if (temp_fd < 0) 
    {
        perror("accept");
        exit(EXIT_FAILURE);
    }
    printf("Connection established with %s:%d\n", 
            inet_ntoa(address.sin_addr), ntohs(address.sin_port));
    return temp_fd;
}

int server_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) 
    {
	    if (errno == EAGAIN || errno == EWOULDBLOCK || errno == ETIMEDOUT)
        {
            printf("socket recv time out \r\n");
            return 1;
        } 
        else 
        {
            perror("recv");
            exit(EXIT_FAILURE);
        }
    }
    *size = bytes_received;
    return 0;
}

void server_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 server_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 server_close_socket(int socket_fd) 
{
    close(socket_fd);
    return 0;
}
  • tcp_server.h
#ifndef __TCP_SERVER__
#define __TCP_SERVER__

#include <sys/socket.h>

#define PORT 8080
#define BUFFER_SIZE 1024

int server_init_socket(void);
int server_accept_client(int socket_fd);
int server_set_socket_timeout(int socket_fd, long milliseconds);
int server_receive_data(int socket_fd, char *message, ssize_t *size) ;
void server_send_data(int socket_fd, const char *message, ssize_t size);
int server_check_tcp_connection(int socket_fd);
int server_close_socket(int fd);

#endif
  • main.c
#include <stdio.h>
#include "tcp_server.h"

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

    server_fd = server_init_socket();
    client_fd = server_accept_client(server_fd);
    
    server_send_data(client_fd, "Hello Client!", 13);
    
    server_receive_data(client_fd, buffer, &size);
    printf("%s", buffer);
    
    server_close_socket(client_fd);
    server_close_socket(server_fd);
    
    return 0;
}
  • 通过交叉编译生成目标程序,拷贝到 Elfboard Linux 开发板上

板级验证

  • 启动 Elfboard Linux 开发板作为服务端,查看 IP:

  • 打开网络调试助手,配置协议类型为 TCP 客户端,设置服务端 IP、端口号:

  • 运行服务端程序,等待客户端连接:

  • 客户端点击连接:

  • 服务端显示客户端已连接:

  • 客户端收到服务端发送的消息:

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

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

以上就是Linux下使用使用socket实现TCP服务端的示例代码的详细内容,更多关于Linux socket实现TCP服务端的资料请关注脚本之家其它相关文章!

相关文章

  • inotify-tools+rsync实时同步文件的配置方法

    inotify-tools+rsync实时同步文件的配置方法

    我使用的是google的inotify-tools,比较简单.国内有功能很强大的类似的程序,但是好复杂.
    2013-02-02
  • Centos7 mysql数据库安装及配置实现教程

    Centos7 mysql数据库安装及配置实现教程

    这篇文章主要介绍了Centos7 mysql数据库安装及配置实现教程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • Linux虚拟机重启找不到IP的解决方案

    Linux虚拟机重启找不到IP的解决方案

    这篇文章主要为大家详细介绍了Linux虚拟机重启找不到IP问题的解决方案,文中通过示例图片和代码进行了详细的讲解,有需要的小伙伴可以参考下
    2024-12-12
  • 使用dig/nslookup命令查看dns解析的方法步骤

    使用dig/nslookup命令查看dns解析的方法步骤

    这篇文章主要介绍了使用dig/nslookup命令查看dns解析的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-11-11
  • Linux下在线安装启动VNC教程

    Linux下在线安装启动VNC教程

    本文指导在CentOS7上在线安装VNC,包含安装、配置密码、启动/停止、清理重启步骤及注意事项,强调需安装VNC桌面以避免黑屏,并解决端口冲突和目录权限问题
    2025-07-07
  • 整理Linux中字符串的相关操作技巧

    整理Linux中字符串的相关操作技巧

    我们在linux的操作中经常会对文件中的字符串进行替换、统计等操作,我们现在来做一次整理,感兴趣的朋友跟随小编一起学习吧
    2018-10-10
  • Centos7下面如何配置静态IP

    Centos7下面如何配置静态IP

    本篇文章主要介绍了Centos7下面如何配置静态IP,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • 详解ubuntu 20.04 LTS安装记录

    详解ubuntu 20.04 LTS安装记录

    这篇文章主要介绍了ubuntu 20.04 LTS安装记录,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • 关于如何在崩溃或重启后保持Linux进程运行的解决方法

    关于如何在崩溃或重启后保持Linux进程运行的解决方法

    在计算机系统中,进程的稳定性和持久性对于确保系统正常运行至关重要,在 Linux 系统中,由于各种原因,进程可能会面临崩溃或系统重启的情况,为了确保关键进程的持续运行,我们需要采取一些措施来处理这种情况,文中给大家介绍的非常详细,需要的朋友可以参考下
    2024-01-01
  • centos6.7 安装python2.7、pip2.7、easy_install-2.7的方法

    centos6.7 安装python2.7、pip2.7、easy_install-2.7的方法

    这篇文章主要介绍了centos6.7 安装python2.7、pip2.7、easy_install-2.7的方法,需要的朋友可以参考下
    2017-03-03

最新评论