【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

相关文章
|
10月前
|
网络协议 开发者 Python
Socket如何实现客户端和服务器间的通信
通过上述示例,展示了如何使用Python的Socket模块实现基本的客户端和服务器间的通信。Socket提供了一种简单且强大的方式来建立和管理网络连接,适用于各种网络编程应用。理解和掌握Socket编程,可以帮助开发者构建高效、稳定的网络应用程序。
560 10
|
Python
Socket学习笔记(二):python通过socket实现客户端到服务器端的图片传输
使用Python的socket库实现客户端到服务器端的图片传输,包括客户端和服务器端的代码实现,以及传输结果的展示。
760 3
Socket学习笔记(二):python通过socket实现客户端到服务器端的图片传输
|
JSON 数据格式 Python
Socket学习笔记(一):python通过socket实现客户端到服务器端的文件传输
本文介绍了如何使用Python的socket模块实现客户端到服务器端的文件传输,包括客户端发送文件信息和内容,服务器端接收并保存文件的完整过程。
717 1
Socket学习笔记(一):python通过socket实现客户端到服务器端的文件传输
|
网络协议 数据处理 C语言
利用C语言基于poll实现TCP回声服务器的多路复用模型
此代码仅为示例,展示了如何基于 `poll`实现多路复用的TCP回声服务器的基本框架。在实际应用中,你可能需要对其进行扩展或修改,以满足具体的需求。
315 0
|
网络协议 C# 开发者
WPF与Socket编程的完美邂逅:打造流畅网络通信体验——从客户端到服务器端,手把手教你实现基于Socket的实时数据交换
【8月更文挑战第31天】网络通信在现代应用中至关重要,Socket编程作为其实现基础,即便在主要用于桌面应用的Windows Presentation Foundation(WPF)中也发挥着重要作用。本文通过最佳实践,详细介绍如何在WPF应用中利用Socket实现网络通信,包括创建WPF项目、设计用户界面、实现Socket通信逻辑及搭建简单服务器端的全过程。具体步骤涵盖从UI设计到前后端交互的各个环节,并附有详尽示例代码,助力WPF开发者掌握这一关键技术,拓展应用程序的功能与实用性。
901 0
|
网络协议 测试技术 网络安全
Python编程-Socket网络编程
Python编程-Socket网络编程
181 0
|
网络协议 开发者 Python
深度探索Python Socket编程:从理论到实践,进阶篇带你领略网络编程的魅力!
【7月更文挑战第25天】在网络编程中, Python Socket编程因灵活性强而广受青睐。本文采用问答形式深入探讨其进阶技巧。**问题一**: Socket编程基于TCP/IP,通过创建Socket对象实现通信,支持客户端和服务器间的数据交换。**问题二**: 提升并发处理能力的方法包括多线程(适用于I/O密集型任务)、多进程(绕过GIL限制)和异步IO(asyncio)。**问题三**: 提供了一个使用asyncio库实现的异步Socket服务器示例,展示如何接收及响应客户端消息。通过这些内容,希望能激发读者对网络编程的兴趣并引导进一步探索。
263 4
|
开发者 Python
Python Socket编程:不只是基础,更有进阶秘籍,让你的网络应用飞起来!
【7月更文挑战第25天】在网络应用蓬勃发展的数字时代,Python凭借其简洁的语法和强大的库支持成为开发高效应用的首选。本文通过实时聊天室案例,介绍了Python Socket编程的基础与进阶技巧,包括服务器与客户端的建立、数据交换等基础篇内容,以及使用多线程和异步IO提升性能的进阶篇。基础示例展示了服务器端监听连接请求、接收转发消息,客户端连接服务器并收发消息的过程。进阶部分讨论了如何利用Python的`threading`模块和`asyncio`库来处理多客户端连接,提高应用的并发处理能力和响应速度。掌握这些技能,能使开发者在网络编程领域更加游刃有余,构建出高性能的应用程序。
170 3
|
网络协议 Python
网络世界的建筑师:Python Socket编程基础与进阶,构建你的网络帝国!
【7月更文挑战第26天】在网络的数字宇宙中,Python Socket编程是开启网络世界大门的钥匙。本指南将引领你从基础到实战,成为网络世界的建筑师。
248 2