socket编程之回声服务器

简介: 回声服务器的实现结合我们之前对socket函数的分析,现在做一个最简单的回声服务器(由客户端输入一串字符,再由服务器端转换成大写字符回显给客户端)

回声服务器的实现

结合我们之前对socket函数的分析,现在做一个最简单的回声服务器(由客户端输入一串字符,再由服务器端转换成大写字符回显给客户端)

特别说明:为了突出代码的逻辑部分,博主就没有在写有关的判断代码了,读者有兴趣可以根据各个函数的返回值自行添加错误判断函数。

server.c


#include<stdio.h>
#include<unistd.h>
#include<string.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<stdlib.h>
#include<netinet/in.h>
#include<ctype.h>
#define SERVER_PORT 6666
#define MAXLINE 100
int main(void){
  /*定义  server端套接字文件描述符:sfd
      client套接字文件描述符:cfd
      read函数读取到的字符数:n */
  int sfd,cfd,n;
  /* server端地址定义(包含IP、PORT、协议族)暂未指定:server_addr
     client端地址定义(包含IP、PORT、协议族)不需要再server.c定义,accept函数会自动填充*/
  struct sockaddr_in server_addr,client_addr;
  socklen_t  client_len;//为 accept函数第三个参数做准备
  char buf[MAXLINE];//接收client端发来的字符的缓冲区
  /*bzero:将server端置空,为了给后续的IP、PORT、协议族赋值所用
   后续操作是为了 bind函数绑定IP、PORT和协议族的固定操作。*/
  bzero(&server_addr,sizeof(server_addr));  
  server_addr.sin_family = AF_INET;//IPV4
  server_addr.sin_port = htons(SERVER_PORT);//转换为网络字节序
  server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
  sfd = socket(AF_INET,SOCK_STREAM,0);
  bind(sfd,(struct sockaddr *)&server_addr,sizeof(server_addr));
  listen(sfd,21);
  while(1){
    client_len = sizeof(client_addr);
    cfd = accept(sfd,(struct sockaddr *)&client_addr,&client_len);//accept调用和会给server端返回一个和client端连接好的socket。
    n = read(cfd,buf,MAXLINE);  
    for(int i=0;i<n;i++){
      buf[i] = toupper(buf[i]);
    }
    write(cfd,buf,n);
    close(cfd);
  }
  return 0;
}

client.c

#include<stdio.h>
#include<unistd.h>
#include<string.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<stdlib.h>
#include<netinet/in.h>
#include<ctype.h>
#define SERVER_PORT 6666
#define MAXLINE 100
int main(void) {
  int sfd, n;
  struct sockaddr_in server_addr;
  char buf[MAXLINE];
  bzero(&server_addr, sizeof(server_addr));
  server_addr.sin_family = AF_INET;
  server_addr.sin_port = htons(SERVER_PORT);
  inet_pton(AF_INET, "127.0.0.1", &server_addr.sin_addr);
  sfd = socket(AF_INET, SOCK_STREAM, 0);
  connect(sfd, (struct sockaddr*)&server_addr, sizeof(server_addr));
  while (1) {
    fgets(buf, sizeof(buf), stdin);
    write(sfd, buf, strlen(buf));
    n = read(sfd, buf, sizeof(buf));
    write(STDOUT_FILENO, buf, n);
  }
  close(sfd);
  return 0;
}


编译代码:


服务器端

gcc server.c -o server

./server

客户端

gcc client.c -o client

./client


测试结果:

在这里插入图片描述

20210426100119441.png

这这部分代码不再详述,想知道原因的可以去我的分类专栏 高性能服务器开发——008.一个简单的网络服务器开发----回声服务器对着部分做了详细的说明


目录
相关文章
|
17天前
|
安全 Java 数据处理
Python网络编程基础(Socket编程)多线程/多进程服务器编程
【4月更文挑战第11天】在网络编程中,随着客户端数量的增加,服务器的处理能力成为了一个重要的考量因素。为了处理多个客户端的并发请求,我们通常需要采用多线程或多进程的方式。在本章中,我们将探讨多线程/多进程服务器编程的概念,并通过一个多线程服务器的示例来演示其实现。
|
17天前
|
程序员 开发者 Python
Python网络编程基础(Socket编程) 错误处理和异常处理的最佳实践
【4月更文挑战第11天】在网络编程中,错误处理和异常管理不仅是为了程序的健壮性,也是为了提供清晰的用户反馈以及优雅的故障恢复。在前面的章节中,我们讨论了如何使用`try-except`语句来处理网络错误。现在,我们将深入探讨错误处理和异常处理的最佳实践。
|
21天前
|
网络协议 程序员 Python
pythonTCP客户端编程创建Socket对象
【4月更文挑战第6天】本教程介绍了TCP客户端如何创建Socket对象。Socket作为网络通信的基础单元,包含协议、IP地址和端口等信息。在TCP/IP中,Socket分为流式(TCP)、数据报(UDP)和原始套接字。以Python为例,创建TCP Socket对象需调用`socket.socket(AF_INET, SOCK_STREAM)`。为确保健壮性,应使用异常处理处理可能的`socket.error`。学习本教程将帮助你掌握TCP客户端创建Socket对象的技能。
|
1月前
|
Ubuntu 网络协议 Java
【Android平板编程】远程Ubuntu服务器code-server编程写代码
【Android平板编程】远程Ubuntu服务器code-server编程写代码
|
21天前
|
网络协议 Python
pythonTCP客户端编程连接服务器
【4月更文挑战第6天】本教程介绍了TCP客户端如何连接服务器,包括指定服务器IP和端口、发送连接请求、处理异常、进行数据传输及关闭连接。在Python中,使用`socket`模块创建Socket对象,然后通过`connect()`方法尝试连接服务器 `(server_ip, server_port)`。成功连接后,利用`send()`和`recv()`进行数据交互,记得在通信完成后调用`close()`关闭连接,确保资源释放和程序稳定性。
|
4天前
|
存储 网络协议 关系型数据库
Python从入门到精通:2.3.2数据库操作与网络编程——学习socket编程,实现简单的TCP/UDP通信
Python从入门到精通:2.3.2数据库操作与网络编程——学习socket编程,实现简单的TCP/UDP通信
|
16天前
|
网络协议 Java API
Python网络编程基础(Socket编程)Twisted框架简介
【4月更文挑战第12天】在网络编程的实践中,除了使用基本的Socket API之外,还有许多高级的网络编程库可以帮助我们更高效地构建复杂和健壮的网络应用。这些库通常提供了异步IO、事件驱动、协议实现等高级功能,使得开发者能够专注于业务逻辑的实现,而不用过多关注底层的网络细节。
|
20天前
|
Python
Python网络编程基础(Socket编程)UDP服务器编程
【4月更文挑战第8天】Python UDP服务器编程使用socket库创建UDP套接字,绑定到特定地址(如localhost:8000),通过`recvfrom`接收客户端数据报,显示数据长度、地址和内容。无连接的UDP协议使得服务器无法主动发送数据,通常需应用层实现请求-响应机制。当完成时,用`close`关闭套接字。
|
1月前
|
网络协议 Perl
Perl 教程 之 Perl Socket 编程 6
Perl Socket教程展示了如何进行网络通信。服务端(server.pl)创建一个TCP套接字,绑定到端口7890并监听,接收客户端连接并发送消息。客户端(client.pl)连接到服务端,接收并打印消息。在两个不同终端上分别运行服务端和客户端可实现交互。
24 2
|
1月前
|
网络协议 Perl
Perl 教程 之 Perl Socket 编程 1
Perl Socket教程介绍了如何进行服务端和客户端编程。服务端使用socket、bind、listen和accept函数建立并监听连接;客户端则通过socket和connect函数连接到服务端。socket函数创建套接字,参数包括协议集(如AF_INET)、套接字类型(如SOCK_STREAM)和传输协议(如TCP)。示例代码展示了如何在Perl中调用socket函数。
17 3