【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

相关文章
|
27天前
|
Python
Socket学习笔记(二):python通过socket实现客户端到服务器端的图片传输
使用Python的socket库实现客户端到服务器端的图片传输,包括客户端和服务器端的代码实现,以及传输结果的展示。
106 3
Socket学习笔记(二):python通过socket实现客户端到服务器端的图片传输
|
27天前
|
JSON 数据格式 Python
Socket学习笔记(一):python通过socket实现客户端到服务器端的文件传输
本文介绍了如何使用Python的socket模块实现客户端到服务器端的文件传输,包括客户端发送文件信息和内容,服务器端接收并保存文件的完整过程。
101 1
Socket学习笔记(一):python通过socket实现客户端到服务器端的文件传输
|
2月前
|
网络协议 数据处理 C语言
利用C语言基于poll实现TCP回声服务器的多路复用模型
此代码仅为示例,展示了如何基于 `poll`实现多路复用的TCP回声服务器的基本框架。在实际应用中,你可能需要对其进行扩展或修改,以满足具体的需求。
77 0
|
3月前
|
网络协议 C# 开发者
WPF与Socket编程的完美邂逅:打造流畅网络通信体验——从客户端到服务器端,手把手教你实现基于Socket的实时数据交换
【8月更文挑战第31天】网络通信在现代应用中至关重要,Socket编程作为其实现基础,即便在主要用于桌面应用的Windows Presentation Foundation(WPF)中也发挥着重要作用。本文通过最佳实践,详细介绍如何在WPF应用中利用Socket实现网络通信,包括创建WPF项目、设计用户界面、实现Socket通信逻辑及搭建简单服务器端的全过程。具体步骤涵盖从UI设计到前后端交互的各个环节,并附有详尽示例代码,助力WPF开发者掌握这一关键技术,拓展应用程序的功能与实用性。
108 0
|
4月前
|
Java
如何在Java中实现多线程的Socket服务器?
在Java中,多线程Socket服务器能同时处理多个客户端连接以提升并发性能。示例代码展示了如何创建此类服务器:监听指定端口,并为每个新连接启动一个`ClientHandler`线程进行通信处理。使用线程池管理这些线程,提高了效率。`ClientHandler`读取客户端消息并响应,支持简单的文本交互,如发送欢迎信息及处理退出命令。
|
21天前
|
弹性计算 网络安全
阿里云国际OpenAPI多接口快速管理ECS服务器教程
阿里云国际OpenAPI多接口快速管理ECS服务器教程
|
4天前
|
弹性计算
阿里云2核16G服务器多少钱一年?亲测价格查询1个月和1小时收费标准
阿里云2核16G服务器提供多种ECS实例规格,内存型r8i实例1年6折优惠价为1901元,按月收费334.19元,按小时收费0.696221元。更多规格及详细报价请访问阿里云ECS页面。
37 9
|
1天前
|
监控 Ubuntu Linux
使用VSCode通过SSH远程登录阿里云Linux服务器异常崩溃
通过 VSCode 的 Remote - SSH 插件远程连接阿里云 Ubuntu 22 服务器时,会因高 CPU 使用率导致连接断开。经排查发现,VSCode 连接根目录 ".." 时会频繁调用"rg"(ripgrep)进行文件搜索,导致 CPU 负载过高。解决方法是将连接目录改为"root"(或其他具体的路径),避免不必要的文件检索,从而恢复正常连接。
|
5天前
|
弹性计算 异构计算
2024年阿里云GPU服务器多少钱1小时?亲测价格查询方法
2024年阿里云GPU服务器每小时收费因实例规格不同而异。可通过阿里云GPU服务器页面选择“按量付费”查看具体价格。例如,NVIDIA A100的gn7e实例为34.742元/小时,NVIDIA A10的gn7i实例为12.710156元/小时。更多详情请访问阿里云官网。
34 2
|
10天前
|
存储 弹性计算 NoSQL
"从入门到实践,全方位解析云服务器ECS的秘密——手把手教你轻松驾驭阿里云的强大计算力!"
【10月更文挑战第23天】云服务器ECS(Elastic Compute Service)是阿里云提供的基础云计算服务,允许用户在云端租用和管理虚拟服务器。ECS具有弹性伸缩、按需付费、简单易用等特点,适用于网站托管、数据库部署、大数据分析等多种场景。本文介绍ECS的基本概念、使用场景及快速上手指南。
40 3