网络安全——对简单服务器的攻击
任务一:做一个服务端程序,其功能是:收到客户端请求之后,将请求中的字符串前后翻转,然后返回给客户端。
1.服务端程序
int main()
{
int listen_socket = Creat_socket();
int client_socket = wait_client(listen_socket);
hanld_client(listen_socket, client_socket);
close(listen_socket);
return 0;
}
首先使用Create_socket()函数创建套接字,然后使用wait_client()函数等待客户端连接,当客户端连接成功并发送数据过来时,使用hanld_client()函数处理数据,即实现字符串翻转功能,最后关闭连接。
创建套接字首先使用socket()函数创建流式套接字,然后设置协议包的内容,使用bind()函数连接套接字,然后使用listen()函数进行监听。
使用accept()函数处理客户端交互,当收到客户端发来的数据时,将其存入buf缓冲区中,并使用hanld_client()函数处理缓冲区。这里我使用的是最简单的字符串翻转方法,即使用temp缓冲区作为临时缓冲区,进行字符串首尾对调。
2.服务端功能实现
void hanld_client(int listen_socket, int client_socket) //信息处理函数,功能是翻转字符串
{
char buf[SIZE];
char temp[SIZE];
while(1)
{
int ret = read(client_socket, buf, SIZE-1);
if(ret == -1)
{
perror("read");
break;
}
if(ret == 0)
{
break;
}
foo(buf);
int i;
for(i=0;i<SIZE;i++){
temp[i]=buf[i];
}
for(i=0;i<ret;i++){
buf[i] = temp[ret-i-1];
}
buf[ret] = '\0';
printf("%s\n", buf);
write(client_socket, buf, ret);
if(strncmp(buf, "end", 3) == 0)
{
break;
}
}
close(client_socket);
}
3.客户端
int main()
{
int client_socket = socket(AF_INET, SOCK_STREAM, 0); //创建和服务器连接套接字
if(client_socket == -1)
{
perror("socket");
return -1;
}
struct sockaddr_in addr;
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET; /* Internet地址族 */
addr.sin_port = htons(PORT); /* 端口号 */
addr.sin_addr.s_addr = htonl(INADDR_ANY); /* IP地址 */
inet_aton("127.0.0.1", &(addr.sin_addr));
int addrlen = sizeof(addr);
int listen_socket = connect(client_socket, (struct sockaddr *)&addr, addrlen); //连接服务器
if(listen_socket == -1)
{
perror("connect");
return -1;
}
printf("成功连接到一个服务器\n");
char buf[SIZE] = {0};
while(1) //向服务器发送数据,并接收服务器转换后的大写字母
{
printf("请输入你相输入的:");
scanf("%s", buf);
write(client_socket, buf, strlen(buf));