#include<string.h>
#include<unistd.h>
#include<signal.h>
#include<sys/ipc.h>
#include<errno.h>
#include<sys/shm.h>
#include<time.h>
#define PERM S_IRUSR|S_IWUSR
#define MYPORT 3490 #define BACKLOG 10
#define WELCOME "|----------Welcome to the chat room! ----------|" //宏定义,当客户端连接服务端时,想客户发送此欢迎字符串 //转换函数,将int类型转换成char *类型
void itoa(int i,char*string) {
int power,j j=i
for(power=1j>=10j/=10) power*=10
for(power>0power/=10){
*string++='0'+i/power i%=power }
*string='\0'}
//得到当前系统时间
void get_cur_time(char * time_str) {
time_t timep
struct tm *p_curtime
char *time_tmp
time_tmp=(char *)malloc(2) memset(time_tmp,0,2)
memset(time_str,0,20) time(&timep)
p_curtime = localtime(&timep) strcat(time_str," (")
itoa(p_curtime->tm_hour,time_tmp) strcat(time_str,time_tmp) strcat(time_str,":")
itoa(p_curtime->tm_min,time_tmp) strcat(time_str,time_tmp) strcat(time_str,":")
itoa(p_curtime->tm_sec,time_tmp) strcat(time_str,time_tmp) strcat(time_str,")")
free(time_tmp)}
//创建共享存储区
key_t shm_create() {
key_t shmid
//shmid = shmget(IPC_PRIVATE,1024,PERM)
if((shmid = shmget(IPC_PRIVATE,1024,PERM)) == -1){
fprintf(stderr,"Create Share Memory Error:%s\n\a",strerror(errno)) exit(1) }
return shmid}
//端口绑定函数,创建套接字,并绑定到指定端口
int bindPort(unsigned short int port) {
int sockfd
struct sockaddr_in my_addr
sockfd = socket(AF_INET,SOCK_STREAM,0)//创建基于流套接字
my_addr.sin_family = AF_INET//IPv4协议族
my_addr.sin_port = htons(port)//端口转换
my_addr.sin_addr.s_addr = INADDR_ANY
bzero(&(my_addr.sin_zero),0)
if(bind(sockfd,(struct sockaddr*)&my_addr,sizeof(struct sockaddr)) == -1){
perror("bind")
exit(1) }
printf("bing success!\n")
return sockfd}
int main(int argc, char *argv[]) {
int sockfd,clientfd,sin_size,recvbytes//定义监听套接字、客户套接字
pid_t pid,ppid //定义父子线程标记变量
char *buf, *r_addr, *w_addr, *temp, *time_str//定义临时存储区
struct sockaddr_in their_addr //定义地址结构
key_t shmid
shmid = shm_create()//创建共享存储区
temp = (char *)malloc(255)
time_str=(char *)malloc(20)
sockfd = bindPort(MYPORT)//绑定端口
while(1){
if(listen(sockfd,BACKLOG) == -1)//在指定端口上监听 {
perror("listen")
exit(1) }
printf("listening......\n")
if((clientfd = accept(sockfd,(struct sockaddr*)&their_addr,&sin_size)) == -1)//接收客户端连接 {
perror("accept")
exit(1) }
printf("accept from:%d\n",inet_ntoa(their_addr.sin_addr))
send(clientfd,WELCOME,strlen(WELCOME),0)//发送问候信息
buf = (char *)malloc(255)
ppid = fork()//创建子进程
if(ppid == 0) {
//printf("ppid=0\n")
pid = fork() //创建子进程
while(1){
{
if(pid >0) {
memset(buf,0,255)
if (strcmp(str_1, “88”) == 0||strcmp(str_1, “byebye”) == 0|| strcmp(str_1, “拜拜”) == 0)
{
Exit(0)
}//当发言者发出类似“88”、“byebye”、“再见”等信息时,能自动结束进程。
if((recvbytes=recv(clientfd,buf,255,0))<=0) {
perror("recv1")
close(clientfd)
raise(SIGKILL)
exit(1)
}
w_addr = shmat(shmid, 0, 0)
memset(w_addr, '\0', 1024)
strncpy(w_addr, buf, 1024)
get_cur_time(time_str)
strcat(buf,time_str)
printf(" %s\n",buf)
}
else if(pid == 0)
{
sleep(1)
r_addr = shmat(shmid, 0, 0)
if(strcmp(temp,r_addr) != 0)
{
strcpy(temp,r_addr)
get_cur_time(time_str)
strcat(r_addr,time_str)
if(send(clientfd,r_addr,strlen(r_addr),0)==-1) {
perror("send")
}
memset(r_addr,'\0',1024)
strcpy(r_addr,temp)
}
}
else
perror("fork")
}
}
}
printf("------------------------------\n")
free(buf)
close(sockfd)
close(clientfd)
return 0
}
//定时器3中断服务程序void TIM3_IRQHandler(void)
{
if(TIM3->SR&0X0001)//溢出中断
{
LED1=!LED1
}
TIM3->SR&=~(1<<0)//清除中断标志位
}
//通用定时器中断初始化
//这里时钟选择为APB1的2倍,而APB1为36M
//arr:自动重装值。
//psc:时钟预分频数
//这里使用的是定时器3!
void Timerx_Init(u16 arr,u16 psc)
{
RCC->APB1ENR|=1<<1//TIM3时钟使能
TIM3->ARR=arr //设定计数器自动重装值//刚好1ms
TIM3->PSC=psc //预分频器7200,得到10Khz的计数时钟
//这两个东东要同时设置才可以使用中断
TIM3->DIER|=1<<0 //允许更新中断
TIM3->DIER|=1<<6 //允许触发中断
TIM3->CR1|=0x01 //使能定时器3
MY_NVIC_Init(1,3,TIM3_IRQChannel,2)//抢占1,子优先级3,组2
}
int main(void)
{
_init(72) //延时初始化
Init() //初始化与LED连接的硬件接口
Timerx_Init(5000,7199)//10Khz的计数频率,计数到5000为500ms
while(1)
{
}
}
1,使能GPIO和串口1的时钟。2,设置串口波特率为115200.
3,设置串口数据宽度为8位
4,设置串口停止位为1位
5,设置串口无校验
6,设置串口无需硬件控制。
7,设置串口的模式
8,根据配置初始化串口。
9,串口使能。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)