ME; //默认为USERNAME,即用户名输入模式
int client_size;
int recv_bits;
char buffer[ BUF_SIZE ];
pid_t pid;
struct sockaddr_in client_addr, server_addr;
client_size = sizeof( struct sockaddr_in );
/* 初始化各变量为零 */
memset( buffer, 0, BUF_SIZE );
memset( &server_addr, 0, sizeof(server_addr) );
memset( &client_addr, 0, sizeof(server_addr) );
if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0 ) //创建socket
printf( "socket failed" );
/* 设置端口快速重用*/
optval = 1;
if ( setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (void *)&optval, sizeof(int)) < 0 )
printf( "setsockopt failed" );
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons( PORT );
server_addr.sin_addr.s_addr = htonl( INADDR_ANY );
if ( bind(sockfd, (struct sockaddr *)&server_addr, sizeof(struct sockaddr_in)) < 0 ) //绑定ip和端口号
printf( "bind failed" );
if ( listen(sockfd, MAX_LISTEN) < 0 ) //建立监听
printf( "listen failed" );
printf("telnet服务器已开启……\n");
while ( 1 ) {
if ( (connfd = accept(sockfd, (struct sockaddr*)&client_addr, &client_size)) < 0 ) //响应客户端请求
printf( "accept failed" );
printf( "Server accept a client: ip = %s\n",inet_ntoa(client_addr.sin_addr) ); //打印客户端ip
/* 创建子进程处理客户端请求 */
if ( (pid = fork()) == 0 ) {
while ( 1 ) {
/* 接受客户端信息 */
if ( (recv_bits = recv(connfd, buffer, BUF_SIZE, 0)) < 0 )
printf( "recv failed" );
/* 去除最后一个字符 */
buffer[recv_bits - 1] = '\0';
/* 用户名鉴定 */
if ( recv_type == USERNAME ) {
if ( strcmp(name, buffer) != 0 ) {
if ( send(connfd, error_user,strlen(error_user), 0) < 0 )
printf( "send failed" );
break;
}else{
if ( send(connfd, correct_user,strlen(correct_user), 0) < 0 )
printf( "send failed" );
}
printf("%s正在登录:",buffer);
recv_type = PASSWORD; //设置标志为密码鉴定模式
}
/* 密码鉴定 */
else if ( recv_type == PASSWORD ) {
if ( strcmp(passwd, buffer) != 0 ) { //验证密码
if ( send(connfd, error_password,strlen(error_password), 0) < 0 )
printf( "send failed" );
} else {
if ( send(connfd, success_login, strlen(success_login), 0) < 0 )
printf( "send failed" );
printf("用户登录成功!\n");
recv_type = COMMAND; //设置标志为命令模式
}
}
/* 命令模式 */
else if( recv_type == COMMAND ) {
command(connfd,buffer);
puts("客户端输入的命令为:");
puts(buffer);
}
}
close( sockfd );
close( connfd );
exit ( 0 );
}
else
close( connfd );
}
return 0;
}
7.2客户端
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#define TRUE 1
#define FALSE -1
#define BUF_SIZE 1024
//登录过程状态标识
char *error_user = "error user name";
char *error_password = "error password";
char *correct_user = "correct user";
char *success_login = "correct password";
char *exit_command = "exit";
char *exit_tip="退出连接!";
/*
* 介绍:客户端
* 功能:
* 1.登录服务器端
* 2.登录后在服务器端对文件进行操作
*/
int send_recv( int connfd,char flag )
{
/*
* 作用:客户端与服务器端信息的处理
* connfd: 服务器端标识
* flag: 输入 |