欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 创投人物 > 一个简单的echo服务器

一个简单的echo服务器

2025/4/17 16:59:05 来源:https://blog.csdn.net/m0_73359068/article/details/146945627  浏览:    关键词:一个简单的echo服务器

前言;
本教程 基于linux,需要读者有系统编程的基础


公共部分

异常处理远远大于你的程序代码 本身

void errif(bool condition,const char* errmsg) {if(condition) {perror(errmsg);exit(EXIT_FAILURE);}
}

perror 为一个错误处理函数,输出到stdout

服务端

//绑定socket部分int sockfd=socket(AF_INET,SOCK_STREAM,0);//自动选协议errif(sockfd==-1,"create socket error");struct sockaddr_in serv_addr;serv_addr.sin_addr.s_addr=INADDR_ANY;serv_addr.sin_family=AF_INET;serv_addr.sin_port=htons(8080);errif(bind(sockfd,(sockaddr*)&serv_addr,sizeof(serv_addr)),"socket bind error");errif(listen(sockfd,SOMAXCONN),"socket listen error");

讲一下
宏 INADDR_ANY 为0.0.0.0 就是可以监听所有IP地址
宏 SOMAXCONN为系统建议最大连接数

//连接部分
struct sockaddr_in clnt_addr;
socklen_t clnt_socklen=sizeof(clnt_addr);
int clnt_fd=accept(sockfd,(sockaddr*)&clnt_addr,&clnt_socklen);printf("new client fd %d! IP: %s Port: %d\n", clnt_fd, inet_ntoa(clnt_addr.sin_addr), ntohs(clnt_addr.sin_port));

这个无疑连接
注意 accept为阻塞函数,即是要等待连接 要不然printf的打印部分出不来

//业务部分
while(true) {char buf[READ_BUF];bzero(&buf,sizeof(buf));size_t read_bytes=read(clnt_fd,buf,sizeof(buf));if(read_bytes>0) {printf("message from %d : %s\n",clnt_fd,buf);write(clnt_fd,buf,sizeof(buf));}else if(read_bytes==0) {printf("client fd %d disconnected\n", clnt_fd);close(clnt_fd);break;}else if (read_bytes == -1){close(clnt_fd);errif(true, "socket read error");}}

read和write是系统函数(linux系统 即是跨平台不强)
先读后写 关系连接

read:
返回值 > 0:表示成功读取的字节数。例如,返回值为 10,表示成功读取了 10 个字节。
返回值 = 0:表示已经到达文件末尾(EOF),没有更多数据可读。这通常发生在读取文件时,文件内容已经全部读完。
返回值 < 0:表示读取操作失败。此时,errno 会被设置为相应的错误码,可以
通过 write同理

错误码表格
以下是将这些错误码及其描述整理成的 Markdown 表格:

错误码值 (具体值可能因系统而异)描述
EINTR通常为 4写入操作被信号中断
EAGAIN通常为 11在非阻塞模式下,无法写入数据
EWOULDBLOCK通常与 EAGAIN 相同在非阻塞模式下,无法写入数据
EFAULT通常为 14缓冲区指针无效
EBADF通常为 9文件描述符无效
ENOSPC通常为 28磁盘空间不足

客户端

//连接部分int sockfd=socket(AF_INET,SOCK_STREAM,0);errif(sockfd==-1,"create socket error");struct sockaddr_in clnt_addr;clnt_addr.sin_family=AF_INET;clnt_addr.sin_port=htons(8080);clnt_addr.sin_addr.s_addr=inet_addr("127.0.0.1");errif(connect(sockfd,(sockaddr*)&clnt_addr,sizeof(clnt_addr))==-1,"socket connect error");

客户端 没有所谓 bind和监听

//业务部分char buf[1024];bzero(&buf,sizeof(buf));scanf("%s",buf);size_t write_bytes=write(sockfd,buf,sizeof(buf));if (write_bytes == -1) {printf("Socket already disconnected, can't write any more!\n");break;}ssize_t read_bytes = read(sockfd, buf, sizeof(buf));if (read_bytes > 0) {printf("Message from server: %s\n", buf);} else if (read_bytes == 0) {printf("Server socket disconnected!\n");break;}else if(read_bytes == -1){close(sockfd);errif(true, "socket read error");}

先写后读 服务器断开

** 运行命令**

g++ server.cpp -o server
g++ client.cpp -o client

分别再不同的终端 ./ server . /client

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词