基于UDP的简易聊天室(客户端)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>


#define N 64


#define TYPE_R   1    // register 
#define TYPE_B   2    // broadcast
#define TYPE_P   3    // private talk
#define TYPE_U   4 // unregister
#define TYPE_Q   5    // quit
#define TYPE_L   6    // user list


typedef struct sockaddr SA;


typedef struct
{
int type;
char from[16];
char to[16];
char text[N];
} MESG;
void handler(int arg);


void RECV(int sockfd,MESG buf)
{
recvfrom(sockfd,&buf,sizeof(buf),0,NULL,NULL);
if(buf.type == TYPE_B)
{
printf("<public>%s: ",buf.from);
printf("%s\n",buf.text);
}
if(buf.type == TYPE_P)
{
printf("<private>:");
printf("%s to you: %s\n",buf.from,buf.text);
}
if(buf.type == TYPE_U)
{
printf("<system>: ");
printf("%s exit the chatroom\n",buf.from);
}
if(buf.type == TYPE_R)
{
printf("<system>: ");
printf("%s is online",buf.text);
}
if(buf.type == TYPE_L)
{
printf("<system>: ");
printf("%s\n",buf.text);
}
}
int main(int argc,char **argv)
{
pid_t pid;
MESG buf;
int sockfd;
struct sockaddr_in seraddr;

if (argc < 3)
{
printf("Usage : %s <my_ip> <my_port>\n", argv[0]);
exit(-1);
}

if ((sockfd = socket(PF_INET, SOCK_DGRAM, 0)) < 0)
{
perror("fail to socket");
exit(-1);
}


bzero(&seraddr, sizeof(seraddr));
seraddr.sin_family = PF_INET;
seraddr.sin_port = htons(atoi(argv[2]));
seraddr.sin_addr.s_addr = inet_addr(argv[1]);

printf("please register you name: \n");
fgets(buf.from,16 ,stdin);
buf.from[strlen(buf.from)-1] = '\0';
char Buf[N];
strcpy(Buf,buf.from);
buf.type = TYPE_R;
sendto(sockfd,&buf,sizeof(buf),0,(SA *)&seraddr,sizeof(seraddr));
recvfrom(sockfd,&buf,sizeof(buf),0,NULL,NULL);
printf("register success!%s\n",buf.from);

signal(SIGCHLD,handler);

if((pid =fork()) <0)
{
perror("fork");
exit(-1);
}
else if(pid == 0)
{
while(1)
{
fgets(buf.text,N,stdin);
if(strncmp(buf.text,"[p]",3)==0)
{
buf.text[strlen(buf.text)-1] = '\0';
strcpy(buf.to,buf.text+3);
printf("what do you want to say\n");
fgets(buf.text,N,stdin);
buf.type = TYPE_P;
}
else if(strncmp(buf.text,"quit",3)==0)
{
strcpy(buf.from,Buf);
buf.type = TYPE_U;
sendto(sockfd,&buf,sizeof(buf),0,(SA *)&seraddr,sizeof(seraddr));
printf("you exit the chat room!\n");
exit(0);
}
else if(strncmp(buf.text,"[l]",3)==0)
{
buf.type = TYPE_L;
}
else
{
buf.type = TYPE_B;
strcpy(buf.from,Buf);
}
sendto(sockfd,&buf,sizeof(buf),0,(SA *)&seraddr,sizeof(seraddr));


}
}
else
{
while(1)
{
RECV(sockfd,buf);//接受server信息
}
}
return 0;
}




void handler(int arg)
{
exit(0);
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值