案例要求
实现一个服务器的连接,要求将客户端的小写转化为大写
声明:因个人能力有限,本文仅是个人的学习记录笔记,有错误之处还望指出
服务器实现流程
- 建立套接字 —>socket
- 绑定套接字,并且初始化套接字结构体 —>bind
- 设置连接上限 —>listen
- 阻塞等待链接 —>accept
- 读取客户端套接字的数据 —>read
- 处理数据 —>toupper
- 将数据修改 —>write
注意事项
1.在利用nc测试导通的时候应该使用127.0.0.1(用此回送地址来测试)
2.bind,connect,accept函数要将sockaddr_in强制转化成socket sockaddr* 格式
3.利用toupper来将字符转化
4.在绑定套接字的时候要注意网络字节序(小端—>大端)
代码实现
#include <sys/types.h>
#include <unistd.h>
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <sys/socket.h>
//端口号
#define SERV_PORT 8888
//ip
#define SERV_IP "127.0.0.1"
//最多连接数
#define MAX_LOG 20
//错误判断
void sys_err(char err[128]){
printf("%s",err);
}
int main(){
//定义ip的保存大小
unsigned char ip_buf[sizeof(struct in_addr)];
//定义socket文件描述符
int cfd , sfd;
int i,n;
char buf[BUFSIZ];
socklen_t client_addr_len;
//创建套接字
sfd = socket(AF_INET,SOCK_STREAM,0);//IPV4 TCP格式
if( sfd == -1)
sys_err("socket");
//绑定套接字
struct sockaddr_in serv_addr,client_addr;//定义结构体(用于指定模式,IP,端口号)
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(SERV_PORT);//端口网络字节序变化
inet_pton(AF_INET,SERV_IP,ip_buf); //ip为字符串类型要先变为整形再便序
//serv_addr.sin_family = htonl(INADDR_ANY);//操作系统随机分配
if(bind(sfd,(struct sockaddr *)&serv_addr,sizeof(serv_addr)) == -1)
sys_err("bind");
//设置最多链接上限
if(listen(sfd,MAX_LOG) == -1)
sys_err("listen");
//阻塞等待连接
client_addr_len = sizeof(client_addr);
cfd = accept(sfd,(struct sockaddr *)&client_addr,&client_addr_len);
if(cfd == -1)
sys_err("accept");
//循环处理数据
while(1){
n = read(cfd,buf,sizeof(buf));
//遍历所有数据小写变大写
for( i = 0 ;i < n;i++){
buf[i] = toupper(buf[i]);
}
write(cfd,buf,n);
}
close(cfd);
close(sfd);
return 0;
}