您的位置:首页 > 其它

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

2015-07-26 14:18 393 查看
#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
;

} 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
;

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);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: