Hello 网络编程

此博客记录网络编程实践,搭建了一个简单的 echo 服务器,可将输入字符小写转大写。介绍了使用 g++ 编译运行及 nc 命令测试的方法。指出该服务器目前仅支持单机连接,系统不稳定且无错误代码检测,作者正从 0 学网络编程。

Hello 网络编程

写下第一篇网络编程博客。
这是一个第一个最简单的 server 端的模型。 一个 echo 服务器,你打什么字,它就给你返回什么字符,只不过小写会转大写。

//
// Created by zxzx on 2021/1/11.
//

// socketaddr_in, sin_family, sin_port,sin_addr

#include <stdio.h>
#include <unistd.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <string.h>
#include <strings.h>
#include <ctype.h>

#define SERV_PORT 6666

int main(void){
	struct sockaddr_in serv_addr, clie_addr;
	int sfd, cfd;
	int len;
	socklen_t clie_addr_len;

	char buf[BUFSIZ]; // BUFSIZ, 这是一个系统宏,指定缓存的大小

	sfd = socket(AF_INET, SOCK_STREAM, 0);// man 7 ip 查看API接口

	serv_addr.sin_family = AF_INET;
	serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); // p87@LHPSP.pdf, 游双的Linux 高性能系统服务器编程
	serv_addr.sin_port = htons(SERV_PORT);

	bind(sfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr));
	listen(sfd, 128); // 默认值

	printf("server ready! wait for connection...");
	clie_addr_len = sizeof(clie_addr); // c语言早期版本先声明后定义,我们保持这个传统

	// 在 监听一个socket, 在此阻塞
	cfd = accept(sfd, (struct sockaddr *)&clie_addr, &clie_addr_len);

	while(1){
		len = read(cfd, buf, sizeof(buf));
		for(int i=0; i<len; i++){
			buf[i] = toupper(buf[i]); // 来自 <ctype.h>
		}

		write(cfd, buf, len); // write函数也源自于 arpa net
	}

	// close(sfd); // 1次连接
	// close(cfd); // 同上
	return 0;

}

如何测试呢?

使用本机的 g++ 命令编译并且运行

g++ server.cpp -o server
./server

使用 nc 命令, nc IP PORT, 比如 nc 127.0.0.1 6666
然后打几个字就可以看到效果了。

Step2 编写客户端

//
// Created by zxzx on 2021/1/11.
//
#include <arpa/inet.h>
#include <sys/socket.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <sys/types.h>
#include <unistd.h>

#define SERV_IP "127.0.0.1"
#define SERV_PORT 6666

int main(){
	int sfd, len;
	struct sockaddr_in serv_addr;
	char buf[BUFSIZ];
	socklen_t serv_addr_len;
	int n;

	sfd = socket(AF_INET, SOCK_STREAM, 0);

	serv_addr.sin_family = AF_INET;
	inet_pton(AF_INET, SERV_IP, &serv_addr.sin_addr.s_addr); // 这个函数的意思是,把字符型转换成数字类型的IP
	serv_addr.sin_port = htons(SERV_PORT);
	serv_addr_len = sizeof(serv_addr);

	connect(sfd, (struct sockaddr *)&serv_addr, serv_addr_len); // connect 类似于 bind+listen+accept,是一个主动连接的函数,主要用于服务端
	while(true){
		fgets(buf, sizeof(buf), stdin);
		write(sfd, buf, strlen(buf)); // #include <unistd.h>, 把buffer里的内容写到 socket里面去,传递给网络
		n = read(sfd, buf, sizeof(buf));
		write(STDOUT_FILENO, buf, n); // 打印到终端
	}
	close(sfd);
	return 0;
}

待改进的地方

目前,我测试的结果是,这个 echo 服务器,只能支持单机连接,多个客户端还是无法连接的,有待改进。
而且,系统相当的不稳定,也没有错误代码检测!

感受

我最开始应该是学 Java 语言的,后来转到 C++,已经感觉非常不舒服了,过了好久才适应过来,因为我想写搜索引擎。
现在又要做网络编程,又用C语言的东西,真的难受极了。
现在跟着别人,从0学网络编程,希望过程顺利一点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值