⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 scd.c

📁 在RedHad9 下实现文字界面的聊天程序。此源码示范了C语言的socket通信编码;RedHad下如何编译c代码。内附说明文档详细说明了socket通信原理和代码解释。
💻 C
📖 第 1 页 / 共 2 页
字号:
			if(tokenPtr != NULL)              
			{	
				printf("It will be send to %s\n",tokenPtr);
				if(one_send(tokenPtr, cli_name, recvbuf)!=1) //发送
				{
					one_send(cli_name,cli_name,errsendbuf); //发送失败,返回错误信息给源信息发送者
				}
				return 4;				
			}
			else
			{
				send(connectfd,m_buf,strlen(m_buf),0);  //发送失败,返回错误信息给源信息发送者
				return 0;
			}
		}				
		else if(!strcmp(tokenPtr,"/nick"))
		{		
			tokenPtr=(char *)strtok(NULL," ");
			if(tokenPtr != NULL)
			{	
				bzero(namechange,sizeof(namechange));
				strcat(namechange,"I have changed my name to be ");
				strcat(namechange,tokenPtr);
						
				namechange[strlen(namechange)]='\0';
				if(changeNickName(cli_name,tokenPtr,connectfd)==1) //change success
				{
					all_send(cli_name,namechange);		//把改名信息群发			
				}	
				bzero(namechange,sizeof(namechange));
				return 3;				
			}
			else
			{
				//send(connectfd,cmderrbuf,strlen(cmderrbuf),0);  //send the error of command 
				one_send(cli_name,cli_name,cmderrbuf);
				return 0;
			}
		}	
		else if(!strcmp(tokenPtr,"/who"))
		{		
			sendcli_list(connectfd); //发送在线用户列表
			return 5;				
			
		}
	
		tokenPtr=(char *)strtok(NULL," ");
	}
	return 0;
}

void all_send(char cli_name[], char msg[])
{
	struct clientsInfo* pcli;
	char sendbuf[MAXDATASIZE];

	pcli = clients;
	while(pcli != NULL)			// send this message to all of the clients
	{
		strcat(sendbuf,cli_name);
		strcat(sendbuf," > ");
		strcat(sendbuf,msg);
		
		//send(pcli->connectfd,sendbuf,strlen(sendbuf),0);	
		sendMsg(pcli->connectfd, sendbuf, pcli->passwd);
		pcli = pcli->next;
		bzero(sendbuf,sizeof(sendbuf));
	}
}

void decrypt(char recvbuf[], char cli_name[])
{
	struct clientsInfo* pcli1;
	int i;
	if(clientsCount > 0)
	{
		pcli1 = clients;			
		while(pcli1 != NULL)           // tranverse the list to find to client
		{
			if(!strcmp(pcli1->nickname,cli_name))  //find by the client name 
			{
				if(strlen(pcli1->passwd)==0)   // no need to decrypt
				{
					printf("no password now\n");
				}
				else                 // we should decrypt
				{					
					 mydecrypt(recvbuf,pcli1->passwd);
				}
				break;
			}
			pcli1=pcli1->next;
		}
	}
}

int one_send(char* tokenPtr, char cli_name[], char msg[])
{
	char sendbuf[MAXDATASIZE];
	struct clientsInfo* pcli1;
	int confd;
		
	bzero(sendbuf,sizeof(sendbuf));
	strcat(sendbuf,cli_name);
	strcat(sendbuf," > ");
	strcat(sendbuf,msg);

	if(clientsCount > 0)
	{		
		pcli1 = clients;		
		while(pcli1 != NULL)           // tranverse the list to find to nickname to change
		{
			if(!strcmp(pcli1->nickname,tokenPtr))  //find it
			{
				confd=pcli1->connectfd;
				//send(confd,sendbuf,strlen(sendbuf),0);			
				sendMsg(confd, sendbuf, pcli1->passwd);
				return 1;
			}
			pcli1=pcli1->next;
		}
	}
	return 0;		
}

void sendcli_list(int connectfd)
{
	struct clientsInfo* pcli1;
	char sendbuf[MAXDATASIZE];
	char pwd[PASSWD];

	if(clientsCount > 0)
	{		
		pcli1 = clients;		
		while(pcli1 != NULL)           
		{
			if( pcli1->connectfd==connectfd)
			{
				strcpy(pwd, pcli1->passwd);	
			}
			strcat(sendbuf,pcli1->nickname);
			strcat(sendbuf,"@");
			strcat(sendbuf,pcli1->hostname);
			strcat(sendbuf,"\n");			
			pcli1=pcli1->next;			
		}
	}
	//send(connectfd,sendbuf,strlen(sendbuf),0);
	sendMsg(connectfd, sendbuf, pwd);
	bzero(sendbuf,sizeof(sendbuf));
	bzero(pwd,sizeof(pwd));
}

int changeNickName(char cli_name[], char newname[],int connectfd)
{
	struct clientsInfo* pcli1;

	if(clientsCount > 0)
	{
		pcli1 = clients;
		while(pcli1 != NULL)           // tranverse the list 
		{
			if(!strcmp(pcli1->nickname, newname))   // to make sure that newname doesn't exits in the list
			{
				//send(connectfd,changerrbuf,strlen(changerrbuf),0);
				one_send(cli_name,cli_name,changerrbuf);
				return 0;
			}
			pcli1 = pcli1->next;
		}		
		pcli1 = clients;		
		while(pcli1 != NULL)           // tranverse the list to find to nickname to change
		{
			if(!strcmp(pcli1->nickname,cli_name))  //find by the original name and replace it
			{
				strcpy(cli_name, newname);
				strcpy(pcli1->nickname, newname);
				return 1;
			}
			pcli1=pcli1->next;
		}
	}
	return 0;
}

int changePasswd(char cli_name[], char passwd[],int connectfd)
{
	struct clientsInfo* pcli1;

	if(clientsCount > 0)
	{
		pcli1 = clients;			
		while(pcli1 != NULL)           // tranverse the list to find to client
		{
			if(!strcmp(pcli1->nickname,cli_name))  //find by the client name and change its password
			{
				strcpy(pcli1->passwd, passwd);
				//printf("password is :%s\n",passwd);
				return 1;
			}
			pcli1=pcli1->next;
		}
	}
	return 0;
}

void getAllCli_Name()
{
	struct clientsInfo* pcli1;

	if(clientsCount > 0)
	{		
		pcli1 = clients;		
		while(pcli1 != NULL)          
		{
			//printf("%s--%s\t",pcli1->nickname,pcli1->hostname);
			//printf("\n");
			pcli1=pcli1->next;
		}
	}
}

int checkParam(int argc,char* argv[],int* isSecure,int* backlog,int* port)
{
	int i;
	if(argc>6)
	{
		printf("Usage: %s [-i] [-m max] [-p port]\n",argv[0]);
		exit(1);
	}
	else if(argc>1)
	{		
		for(i=1;i<argc;i++)
		{
			if(!strcmp(argv[i],"-i"))
			{				
				*isSecure=0;
			}
			else if(!strcmp(argv[i],"-m"))
			{
				if(argc>i+1)
				{
					*backlog=atoi(argv[i+1]);
					if(*backlog<=0)
					{
						*backlog=0;
					}
				}
				else
				{
					printf("Usage: %s [-i] [-m max] [-p port]\n",argv[0]);
					return 0;
				}
			}
			else if(!strcmp(argv[i],"-p"))
			{	
				if(argc>i+1)
				{			
					*port=atoi(argv[i+1]);				
					if(*port<=0)
					{
						*port=0;
					}
				}
				else
				{
					printf("Usage: %s [-i] [-m max] [-p port]\n",argv[0]);
					return 0;
				}
			}
		}	
	}
	return 1;
}

void ReadHelpFile(char cmdbuf[])
{
	int i;
	char c;
	FILE* cfPtr;

	if((cfPtr=fopen("Help.dat","r"))==NULL)
	{
		printf("read Help file error");
	}
	else
	{		
		i=0;
		while((c=fgetc(cfPtr))!=EOF && i<MAXDATASIZE)
		{
			cmdbuf[i]=c;
			i++;
		}
		fclose(cfPtr);		
	}
}

int sendMsg(int sockfd, char sendline[], char passwd[])
{
	if(strlen(passwd)>=0)
	{
		myencrypt(sendline, passwd);
	}
	send(sockfd,sendline,strlen(sendline),0);	
}

void myencrypt(char sendbuf[], char passwd[])
{
	int i;
	int buflength;
	int pwdlength;
	buflength = strlen(sendbuf);
	pwdlength = strlen(passwd);
//printf("\n--%d--%s--\n",pwdlength, passwd);
	for( i=0; i<buflength ; i++)
	{
		sendbuf[i]=sendbuf[i]+passwd[i%pwdlength];
	}
}


void mydecrypt(char sendbuf[], char passwd[])
{
	int i;
	int buflength;
	int pwdlength;
	buflength = strlen(sendbuf);
	pwdlength = strlen(passwd);
//printf("\n--%d--%s--\n",pwdlength, passwd);
	for( i=0; i<buflength ; i++)
	{
		sendbuf[i]=sendbuf[i]-passwd[i%pwdlength];
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -