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

1657

被折叠的 条评论
为什么被折叠?



