首页 > 其他分享 >简单Echo服务器的实现

简单Echo服务器的实现

时间:2023-12-03 10:36:54浏览次数:37  
标签:socket buffer address server client 简单 服务器 message Echo

简单Echo服务器的实现

1. 要求

    实现Echo服务器的客户端/服务器程序,客户端通过网络连接到服务器,并发送任意一串英文信息,服务器端接收信息后,将每个字符转换为大写并回送给客户端显示。
    这个项目的主要目的:熟悉C语言的网络编程(Socket),为开发更高级的网络应用打好基础。

2. 服务器端代码

#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 server_socket,client_socket;
    struct sockaddr_in server_address;
    struct sockaddr_in client_address;
    socklen_t client_address_length;
    client_address_length = sizeof(client_address);

    /* 1. create server socket
          arguments: AF_INET -> use IPv4
	             SOCK_STREAM -> use tcp
     */
    server_socket = socket(AF_INET,SOCK_STREAM,0);
    // 2. clear server_address and write server address and server port
    bzero(&server_address,sizeof(server_address));
    server_address.sin_family = AF_INET;                 // ipv4
    server_address.sin_addr.s_addr = htonl(INADDR_ANY);  // designate all ip address
    server_address.sin_port = htons(SERVER_PORT);        // designate server port
    // 3. bind sevrer ip and port to server socket
    bind(server_socket,(struct sockaddr *)&server_address,sizeof(server_address));
    // 4. start to listen
    listen(server_socket,1024);

    printf("wait client message .....\n");

    // start process client's request
    int done = 1; 
    while(done){
	    int message_length;
	    char client_ip_address[64];
	    char buffer[256];
	    // start accept client request in order to client socket
        client_socket = accept(server_socket,(struct sockaddr *)&client_address,&client_address_length);
        // print client's ip and port
	    printf("client ip: %s\tport: %d\n",inet_ntop(AF_INET,&client_address.sin_addr.s_addr,client_ip_address,sizeof(client_ip_address)),ntohs(client_address.sin_port));
	    // read client message
	    // -1 to prevent over the border
	    message_length = read(client_socket,buffer,sizeof(buffer)-1);
        // set string end symbol
	    buffer[message_length] = '\0';
        printf("receive[%d]: %s\n",message_length,buffer);
	    // lower letter convert to  upper letter(a-z -> A-Z)
	    for(int i = 0; i < message_length; i ++){
	        buffer[i] = toupper(buffer[i]);
        }
	    // client's message write back to client
	    write(client_socket,buffer,message_length);
	    printf("finished len: %d\n",message_length);
	    // over client's connect
	    close(client_socket);
    }
    // over server's connect
    close(server_socket);
    return 0;
}

3. 客户端代码

#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 "10.0.0.1"

int main(int argc,char *argv[]){
	int client_socket;
	char message[256];
	struct sockaddr_in server_address;
	int n;
	char buffer[256];

	/*if(argc != 2){
		fputs("Error! number of arguments is incorrect!\n",stderr);
		exit(1);
	}
	*/

	memset(&server_address,'\0',sizeof(struct sockaddr_in));
	server_address.sin_family = AF_INET;
	inet_pton(AF_INET,SERVER_IP,&server_address.sin_addr);
	server_address.sin_port = htons(SERVER_PORT);

	// message = argv[1];

	int done = 1;
	while(done){
		memset(buffer,'\0',sizeof(buffer));
		//gets is very dangerous
        gets(message);
		printf("message:%s\n",message);

		client_socket = socket(AF_INET,SOCK_STREAM,0);

		connect(client_socket,(struct sockaddr *)&server_address,sizeof(server_address));

		write(client_socket,message,strlen(message));

		n = read(client_socket,buffer,sizeof(buffer) - 1);

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

4. 结果(在mininet上进行测试)

    h1为服务器,h2为客户端。二者均可以通信。

img

5. 参考资料

    https://www.bilibili.com/video/BV14Y411s7yB/?spm_id_from=333.1007.top_right_bar_window_custom_collection.content.click&vd_source=a642bb3ddc5b706845426dc41d73fbda

标签:socket,buffer,address,server,client,简单,服务器,message,Echo
From: https://www.cnblogs.com/gao79135/p/17872619.html

相关文章

  • 三丰免费云服务器性能评价
    三丰免费云服务器是一种提供免费使用的云计算服务,它具有一定的性能和功能。以下是对三丰免费云服务器性能的评价:首先,三丰免费云服务器提供了可靠的计算性能。它采用了先进的硬件设备和虚拟化技术,能够提供稳定的计算资源。用户可以在云服务器上运行各种应用程序和服务,包括网站托管......
  • 华为云IotDA平台与OBS进行数据转发并使用ECS服务器完成数据调用
    华为云IotDA平台与OBS进行数据转发并使用ECS服务器完成数据调用一、通过IotDA平台接入物联网设备参考博客:https://www.cnblogs.com/gitcatone/p/17796975.html二、注册ECS服务器并进行远程控制产品简介ECS弹性服务器,一款运行在云端的弹性虚拟计算机,能够实现弹性储存容量与......
  • 最简单的方式解决Intel大小核调度问题
    现在Intel的大小核调度逻辑主要有个问题是窗口不在焦点可能会被扔到小核。修改完后的逻辑:无论前台还是后台,无论轻负载还是高负载,全部优先使用大核,此时处理器和你关闭小核逻辑差不多。只有大核全部满载,忙不过来时,小核会开始介入,例如多核压缩,压制,跑分等。我个人觉得这种调度非常完......
  • Linux服务器禁用密码登录
    前言以前没太研究仔细过SSH,会用就了不起了。最近太闲了,然后一直在研究些杂七杂八的东西,发现自己知道的实在太少了吧(气鼓鼓)还是要继续努力学习啊!开始今天的正题:禁用密码登录。为什么要禁用密码登录?避免别人破译你的服务器密码进行登录(巴拉巴拉一大堆理由,好吧!其实就搞着好玩的,然后顺......
  • 总结-解决国内服务器、nas 、docker访问国外网站、更新镜像、遇到的问题
    proxy可以通过修改环境变量,添加代理协议、服务器ip和端口,可以解决访问github、google等网站的问题,同时会遇到国内外分流、ipv6访问等问题。详细可以寻找projectX。解决DNS的问题运营商的dns存在着污染的情况,导致一些网页解析到了无法访问的ip,可以通过以下方法解决。修改DNS......
  • 02-简单的C/S阻塞模型
    C/S阻塞模型是指客户端/服务器阻塞模型,它描述了一种基于阻塞的网络通信方式。在阻塞模型中,客户端发送请求给服务器,并等待服务器的响应。在等待服务器响应的过程中,客户端的操作会被阻塞,直到服务器响应返回或超时。服务器服务器基本流程如下:启动网络库创建服务器Socket绑定服......
  • Linux服务器SSH免密登录配置记录
    前言最近又得到一台新服务器,开心!趁着没有部署项目,使劲造,哈哈哈哈~本文的服务器配置除了是出于安全性相关考虑,还有主要是密码又长又复杂,有些连接工具还不能复制粘贴,手输不对(痛苦面具)所以为了高效快速的投入工作,赶紧把免密登录(密钥)搞起来吧。配置免密登录步骤首先需要在本地计算机上......
  • C++聊天集群服务器5
    一、服务器异常处理函数​ 这部分主要处理服务器异常退出时,用户的在线状态还是online不会改变,因此需要修改。由于是需要对用户进行操作,因此我们在user表的数据操作类添加重置用户状态函数。​ 在usermodel.hpp添加后:#ifndefUSERMODEL_#defineUSERMODEL_#include"user.hpp......
  • 创建简单的WCF服务
    创建Service项目在VisualStudio中新建项目,ClassLibrary(.NETFramework),叫MyServie。添加WCFService在创建好的项目中添加WCFService,命名为MyService此时会有一个System,ServiceModel出现在引用中。实现MyService类中的DoWork方法namespaceMyService{publiccl......
  • 记录--原来前端部署这么简单
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助前言有个朋友说前端技能大家大部分都会,就是部署项目这一块经验都比较稀缺,一直很想学一下。所以在这里写一篇简单的从零开始部署前端项目的全过程,感兴趣的掘友们或者想自己搭建项目部署的可以看一下这篇。环境搭......