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

测试结果:
在这里插入图片描述在这里插入图片描述

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值