【Socket】简单的回声服务器实现

简介: 【Socket】简单的回声服务器实现

网络通信

Socket通信的3要素

  1. 通信的目的地址
  2. 使用的端口号
  3. 使用的传输层协议(如TCP、UDP)

Socket通信模型

image-20220502174714890

简单的回声服务器实现

服务端

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <ctype.h>
#include <arpa/inet.h>


#define SERVER_PORT 666

int main(void){

    int sock;//信箱

    struct sockaddr_in server_addr;


    //创建信箱
    sock = socket(AF_INET,SOCK_STREAM,0);
    
    
    //清空标签
    bzero(&server_addr,sizeof(server_addr));    
    //写上地址和端口号
    server_addr.sin_family = AF_INET;        //选择协议族ipv4
    server_addr.sin_addr.s_addr = htonl(INADDR_ANY);//监听本地所有IP地址-几个网卡就有几个IP地址
    server_addr.sin_port = htons(SERVER_PORT);    //绑定端口号

    //实现标签贴到收信的信箱上
    bind(sock,(struct sockaddr*)&server_addr,sizeof(server_addr));

    //邮箱一次性只能接收128封信件
    listen(sock,128);

    printf("等待客户端链接\n");

    int done = 1;
    
    while(done){
        struct sockaddr_in client;
        
        int client_socket;        
        int len;

        char client_ip[64];
        
        char buf[256];

        socklen_t client_addr_len;

        client_addr_len = sizeof(client);    
            
        client_socket = accept(sock,(struct sockaddr*)&client,&client_addr_len);

        printf("客户端地址:%s\t端口:%d\n",inet_ntop(AF_INET,&client.sin_addr.s_addr,client_ip,sizeof(client_ip)),ntohs(client.sin_port));

        //读取数据
        len = read(client_socket,buf,sizeof(buf)-1);

        buf[len] = '\n';//read读过来的数据不会自动加字符串结束符

        printf("收到[%d]:%s\n",len,buf);

        len = write(client_socket,buf,len);//发回去

        printf("写完,len:%d",len);

        close(client_socket);
    }

    return 0;
}

可以使用telnet来模拟客户端链接服务器。例如:

image-20220502224213022

客户端

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>

#define SERVER_PORT 666
#define SERVER_IP "127.0.0.1"


int main(int argc, char* argv[]) {

    int sockfd;
    char* message;

    struct sockaddr_in servaddr;

    int n;

    char buf[64];

    //echo_client "xxxx"   ——所以判断是否为2
    if (argc != 2) {
        fputs("Usage: ./echo_client message \n",stderr);
        exit(1);
    }

    message = argv[1];
    printf("message: %s\n",message);


    sockfd = socket(AF_INET,SOCK_STREAM,0);

    memset(&servaddr,'\0',sizeof(struct sockaddr_in));

    servaddr.sin_family = AF_INET;

    //inet_pton(AF_INET,SERVER_IP,&servaddr.sin_addr);
    inet_pton(AF_INET, SERVER_IP, &servaddr.sin_addr);
    servaddr.sin_port = htons(SERVER_PORT); //转换为网络字节序

    connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr));

    write(sockfd,message,strlen(message));

    n = read(sockfd, buf, sizeof(buf)-1);

    if (n > 0) {
        buf[n] = '\n';
        printf("receive: %s\n",buf);
    } else {
        perror("error!");
    }

    printf("finished!\n");
    close(sockfd);

    return 0;
}

测试

image-20220503000726910

相关文章
|
1月前
|
Python
Socket学习笔记(二):python通过socket实现客户端到服务器端的图片传输
使用Python的socket库实现客户端到服务器端的图片传输,包括客户端和服务器端的代码实现,以及传输结果的展示。
129 3
Socket学习笔记(二):python通过socket实现客户端到服务器端的图片传输
|
1月前
|
JSON 数据格式 Python
Socket学习笔记(一):python通过socket实现客户端到服务器端的文件传输
本文介绍了如何使用Python的socket模块实现客户端到服务器端的文件传输,包括客户端发送文件信息和内容,服务器端接收并保存文件的完整过程。
135 1
Socket学习笔记(一):python通过socket实现客户端到服务器端的文件传输
|
2月前
|
网络协议 数据处理 C语言
利用C语言基于poll实现TCP回声服务器的多路复用模型
此代码仅为示例,展示了如何基于 `poll`实现多路复用的TCP回声服务器的基本框架。在实际应用中,你可能需要对其进行扩展或修改,以满足具体的需求。
81 0
|
3月前
|
网络协议 C# 开发者
WPF与Socket编程的完美邂逅:打造流畅网络通信体验——从客户端到服务器端,手把手教你实现基于Socket的实时数据交换
【8月更文挑战第31天】网络通信在现代应用中至关重要,Socket编程作为其实现基础,即便在主要用于桌面应用的Windows Presentation Foundation(WPF)中也发挥着重要作用。本文通过最佳实践,详细介绍如何在WPF应用中利用Socket实现网络通信,包括创建WPF项目、设计用户界面、实现Socket通信逻辑及搭建简单服务器端的全过程。具体步骤涵盖从UI设计到前后端交互的各个环节,并附有详尽示例代码,助力WPF开发者掌握这一关键技术,拓展应用程序的功能与实用性。
113 0
|
4月前
|
Java
如何在Java中实现多线程的Socket服务器?
在Java中,多线程Socket服务器能同时处理多个客户端连接以提升并发性能。示例代码展示了如何创建此类服务器:监听指定端口,并为每个新连接启动一个`ClientHandler`线程进行通信处理。使用线程池管理这些线程,提高了效率。`ClientHandler`读取客户端消息并响应,支持简单的文本交互,如发送欢迎信息及处理退出命令。
|
5天前
|
机器学习/深度学习 人工智能 弹性计算
什么是阿里云GPU云服务器?GPU服务器优势、使用和租赁费用整理
阿里云GPU云服务器提供强大的GPU算力,适用于深度学习、科学计算、图形可视化和视频处理等多种场景。作为亚太领先的云服务提供商,阿里云的GPU云服务器具备灵活的资源配置、高安全性和易用性,支持多种计费模式,帮助企业高效应对计算密集型任务。
|
7天前
|
存储 分布式计算 固态存储
阿里云2核16G、4核32G、8核64G配置云服务器租用收费标准与活动价格参考
2核16G、8核64G、4核32G配置的云服务器处理器与内存比为1:8,这种配比的云服务器一般适用于数据分析与挖掘,Hadoop、Spark集群和数据库,缓存等内存密集型场景,因此,多为企业级用户选择。目前2核16G配置按量收费最低收费标准为0.54元/小时,按月租用标准收费标准为260.44元/1个月。4核32G配置的阿里云服务器按量收费标准最低为1.08元/小时,按月租用标准收费标准为520.88元/1个月。8核64G配置的阿里云服务器按量收费标准最低为2.17元/小时,按月租用标准收费标准为1041.77元/1个月。本文介绍这些配置的最新租用收费标准与活动价格情况,以供参考。
|
5天前
|
机器学习/深度学习 人工智能 弹性计算
阿里云GPU服务器全解析_GPU价格收费标准_GPU优势和使用说明
阿里云GPU云服务器提供强大的GPU算力,适用于深度学习、科学计算、图形可视化和视频处理等场景。作为亚太领先的云服务商,阿里云GPU云服务器具备高灵活性、易用性、容灾备份、安全性和成本效益,支持多种实例规格,满足不同业务需求。
|
13天前
|
弹性计算
阿里云2核16G服务器多少钱一年?亲测价格查询1个月和1小时收费标准
阿里云2核16G服务器提供多种ECS实例规格,内存型r8i实例1年6折优惠价为1901元,按月收费334.19元,按小时收费0.696221元。更多规格及详细报价请访问阿里云ECS页面。
51 9
|
10天前
|
监控 Ubuntu Linux
使用VSCode通过SSH远程登录阿里云Linux服务器异常崩溃
通过 VSCode 的 Remote - SSH 插件远程连接阿里云 Ubuntu 22 服务器时,会因高 CPU 使用率导致连接断开。经排查发现,VSCode 连接根目录 ".." 时会频繁调用"rg"(ripgrep)进行文件搜索,导致 CPU 负载过高。解决方法是将连接目录改为"root"(或其他具体的路径),避免不必要的文件检索,从而恢复正常连接。