TCP通信及基于OpenSSL实现TLS

本文详细介绍了Socket在不相关且不共享文件系统的网络通信中的应用,涉及TCP/IP协议、Unix套接字接口、服务器端和客户端的连接建立过程,以及TLS/SSL在安全通信中的部署,包括服务器端和客户端的步骤实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Socket

当通信过程不相关且不共享文件系统时,可以采用何种机制?这就需要一个通用的传输层通信子系统驻留在每个参与通信的主机上,如TCP/IPTCP/IP是Internet上使用的通用消息传输协议族。该子系统将网络上的一个端点的消息路由并传递到另一个端点。Unix套接字接口是一种将程序的地址空间(a socket)中的引用对象与底层消息传输子系统中的通信端点(a port)绑定的方式,以实现在网络软件连接的端点之间进行消息传递。

在网络通信中,服务器首先创建一个本地套接字,并将其绑定到通信子系统中唯一的端口地址。然后,它告诉通信,使这成为一个侦听端口,以便它可以创建一个相关的请求队列。然后,服务器等待进入的连接。客户端创建一个本地套接字,并要求通信子系统使用服务器的已知端口号将其套接字连接到远程服务器。每个被接受的连接建立一个新的临时服务器端套接字,用于处理特定的客户机/服务器交换。例如,允许多个线程使用相同的服务器端口号处理与客户端的独立连接。

连接被接受和建立后,通信通过写入客户端的本地套接字进行,数据通过网络被TCP/IP透明地携带,并可通过另一端的服务器套接字接收。服务器解析并作用于请求,然后可以将响应写入自己的套接字并关闭连接。然后将响应返回给客户端在TCP/IP协议下,客户端将从其套接字中读取响应,然后关闭其侧的连接。

实现消息交换的Socket接口的基本调用序列。

实现客户服务器消息交换的Socket接口的基本调用序列。

TCP

TCP 服务端步骤

记得配置好gcc,gcc使用可参考:gcc与Makefile

/*************** Server Code ****************/

#include <stdio.h>      /* for printf() and fprintf() */
#include <sys/socket.h> /* for socket(), bind(), and connect() */
#include <arpa/inet.h>  /* for sockaddr_in and inet_ntoa() */
#include <stdlib.h>     /* for atoi() and exit() */
#include <string.h>     /* for memset() */
#include <unistd.h>     /* for close() */

#define MAXPENDING 5    /* Maximum outstanding connection requests */
#define RCVBUFSIZE 32   /* Size of receive buffer */

int main(int argc, char *argv[])
{
   
    int servSock;               /* Socket descriptor for server */
    int clntSock;               /* Socket descriptor for client */
    struct sockaddr_in echoServAddr; /* Local address */
    struct sockaddr_in echoClntAddr; /* Client address */
    unsigned short echoServPort;   /* Server port */
    unsigned int clntLen;       /* Length of client address data structure */
    char echoBuffer[RCVBUFSIZE];    /* Buffer for receiving client's msg string */
    int recvMsgSize;            /* Size of received message */
    char *echoString;           /* Server's reply to client */
    unsigned int echoStringLen;     /* Length of server's reply string */

    echoString = "server is alive, how are you?"; /* Server's reply to client */
    echoStringLen = 29;

    echoServPort = 23; /* local port on which server is going to listen */

    /* Create local TCP/IP socket for incoming connections */
    servSock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);

    /* Construct local address structure */
    memset(&echoServAddr, 0, sizeof(echoServAddr)); /* Zero out structure */
    echoServAddr.sin_family = AF_INET; /* Internet address family */
    echoServAddr.sin_addr.s_addr = htonl(INADDR_ANY); /* Any incoming interface */
    echoServAddr.sin_port = htons(echoServPort); /* Local port */

    /* Bind local socket to the desired server port address */
    int flag = bind(servSock, (struct sockaddr *) &echoServAddr, sizeof(echoServAddr));
    if (flag == -1) {
   
        printf("error");
        return 0;
    }

    /* Mark the socket so it will listen for incoming connections */
    listen(servSock, MAXPENDING);

    for (;;) /* Run forever */
    {
   
        /* Set the size of the in-out parameter */
        clntLen = sizeof(echoClntAddr);

        /* Blocking wait for a client to connect */
        clntSock = accept(servSock
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值