/*
* 聊天室客户端
*
*/
#include
#include
#include
#include
#include
#include
#include
#include
#include
int sockfd;
char *IP = "127.0.0.1";
short PORT = 10222;
typedef struct sockaddr SA;
char name[20]; /* 客户端昵称 */
/* 启动客户端,连接服务器 */
void init()
{
printf("聊天室客户端可是启动\n");
sockfd = socket(AF_INET,SOCK_STREAM,0);
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(PORT);
addr.sin_addr.s_addr = inet_addr(IP);
if(connect(sockfd,(SA*)&addr,sizeof(addr))==-1){
perror("无法连接到服务器\n");
printf("客户端启动失败\n");
}
printf("客户端启动成功!\n");
}
void *recv_thread(void *p)
{
while(1){
char buf[100] = {0};
if(resv(sockfd,buf,sizeof(buf),0)<=0){
return;
}
printf("%s\n",buf);
}
}
/* 开始通信 */
void start()
{
/* 发送消息,发送之前启动一个线程,
用来接受服务器发送过来的消息. */
pthread_t pid;
pthread_create(&pid,0,recv_thread,0);
while(1){
char buf[100] = {0};
scanf("%s",buf); /* 接受用户输入 */
char msg[100] = {0};
sprintf(msg,"%s说:%s",name,buf);
send(sockfd,msg,strlen(msg),0); /* 发给服务器 */
}
}
void sig_close()
{
close(sockfd);
exit(0);
}
int main()
{
signal(SIGINT,sig_close); /* 关闭Ctrl+C */
printf("请输入您的昵称:");
scanf("%s",name);
init(); /* 连接服务器 */
send(sockfd,name,strlen(name),0); /* 将昵称发给服务器 */
start();
return 0;
}
#include
#include
#include
#include
#include
#include
#include
#include
#include
int sockfd;
char *IP = "127.0.0.1";
short PORT = 10222;
typedef struct sockaddr SA;
struct client
{
char name[20]; /* 存储客户昵称 */
int fds; /* 客户端的socket描述符 */
};
struct client c[100] = {0}; /* 最多记录100个连接 */
int size = 0; /* 初始化服务器的网络,创建socket */
/* 初始化服务器的网络,
创建socket. */
void init()
{
printf("聊天室服务器开始启动...\n");
sockfd = socket(AF_INET,SOCK_STREAM,0);
if(sockfd==-1)
{
perror("创建socket失败\n");
printf("服务器启动失败\n");
exit(-1);
}
/* 配置socket地址参数 */
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(PORT);
addr.sin_addr.s_addr = inet_addr(IP);
/* 绑定服务器 */
if(bind(sockfd,(SA*)&addr,sizeof(addr)==-1){
perror("绑定失败\n");
printf("服务器启动失败\n");
exit(-1);
}
printf("绑定成功!\n");
/* 设置监听 */
if(listen(sockfd,10)==-1){
perror("设置监听失败\n");
printf("服务器启动失败\n");
exit(-1)'
}
printf("设置监听成功!\n");
printf("初始化服务器成功\n");
}
/* 分发消息 */
void sendMsg2All(char *msg)
{
int i=0;
for(;i0){
strcpy(c[size].name,name); /* 获取昵称 */
}
size++;
char tishi[100] = {0};
/* 群发通知消息 */
sprintf(tishi,"热烈欢迎%s登录聊天室..\n",name);
sendMsg2All(tishi);
while(1)
{
char buf[100] = {0};
if(recv(fd,buf,sizeof(buf),0)==0){ /* 返回0标识TCP另一端断开连接 */
printf("fd=%dquit\n",fd); /* 测试 */
int i;
char name[20] = {0};
for(i=0;ifd=%dquit\n",fd);
char msg[100] = {0};
sprintf(msg,"欢送%s离开聊天室,再见!\n",name);
/* 群发退出通知. */
sendMsg2All(msg);
close(fd);
return;
}
}
}
sendMsg2All(buf);
}
}
/* 启动服务,等待客户端请求. */
void service()
{
printf("服务器开始启动服务\n");
while(1)
{
struct sockaddr_in fromaddr;
socklen_t len = sizeof(fromaddr);
int fd = accept(sockfd,(SA*)&fromaddr,&len);
if(fd==-1){
printf("客户端连接出错!\n");
continue; /* 继续循环,处理连接 */
}
/* */
printf("fd=%d\n",fd); /* 测试 */
pthread_t thrd;
pthread_creat(&thrd,service_thread,&fd);
}
}
/* 关闭服务器. */
void sig_close()
{
close(sockfd);
printf("服务器已经关闭\n");
exit(0);
}
int main()
{
signal(SIGINT,sig_close); /* 退出Ctrl+C */
init();
service();
return 0;
}