基于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);
}
#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);
}
相关文章推荐
- crossApp初级-CAButton类-7
- Redis_DataType
- iOS学习之UIPickerView控件的关联选择
- 基于UDP的简易聊天室(服务器端)
- Java Base64、AES、SHA1、MD5加密算法
- linux系统管理之lvm动态逻辑卷
- JAVA注解
- ios--NavigationViewController跳转、返回传值
- A - 广搜 基础
- ZOOM:1的原理和作用
- 【D3 API 中文手册】
- 使用segue时如何实现login的判断
- 隐藏NavigationBar上返回按钮的实现方法
- 常用正则表达式大全!(例如:匹配中文、匹配html)
- CentOS虚拟机静态IP配置过程及问题分析
- oracle中修改表名
- pom.xml中的通用合并策略
- Cocoa过滤器NSPredicate的完全用法
- iOS UINavigationController与UITabBarController的组合使用
- UINavigationController within a UITabBarController, setting the navig