回声服务器的实现
特别说明:为了突出代码的逻辑部分,博主就没有在写有关的判断代码了,读者有兴趣可以根据各个函数的返回值自行添加错误判断函数。
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.一个简单的网络服务器开发----回声服务器对着部分做了详细的说明