回声服务器的实现
结合我们之前对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.一个简单的网络服务器开发----回声服务器对着部分做了详细的说明