unix高级编程-多人聊天程序
来源:互联网 发布:重建僵尸大陆3修改数据 编辑:程序博客网 时间:2024/06/11 15:03
来自大内培训,代码自己敲下来的。。。。
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <pthread.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>//判断字符 isxxx(char)
typedef struct sockaddr* sa;
typedef struct{
int s;
char ip[16];
}client;
#define MAX 100
client cs[MAX];
pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER;
void broadcast(int c,void* msg,int n)
{
write(STDOUT_FILENO,msg,n);
pthread_mutex_lock(&m);
int i;
for(i=0;i<MAX;i++)
{
if(cs[i].s!=0&&cs[i].s!=c)
write(cs[i].s,msg,n);
}
pthread_mutex_unlock(&m);
}
void* func(void* p)
{
client* q=p;
char ip[16];
pthread_mutex_lock(&m);
int c=q->s;
strcpy(ip,q->ip);
pthread_mutex_unlock(&m);
char msg[1000];
int n=sprintf(msg,"welcome %s joining",ip);
broadcast(0,msg,n);//对所有客户端广播
int iplen = sprintf(msg,"%s say:",ip);
char* info = msg+iplen;//info指向冒号后面
while(1)
{
int len=read(c,info,sizeof(msg)-iplen);
if(len<=0) break;
if(info[0]=='q'&&isspace(info[1])) break;
broadcast(c,msg,len+iplen);
}
pthread_mutex_lock(&m);
q->s = 0;
pthread_mutex_unlock(&m);
close(c);n = sprintf(msg,"%s leaved\n",ip);
broadcast(0,msg,n);
}
int main()
{
int s= socket(AF_INET,SOCK_STREAM,0);
struct sockaddr_in si;
si.sin_family=AF_INET;
si.sin_addr.s_addr=0;
si.sin_port=htons(8888);
if(bind(s,(sa)&si,sizeof(si))<0)
{
perror("bind");
return -1;
}
listen(s,5);
while(1)
{
socklen_t len = sizeof(si);
int c =accept(s,(sa)&si,&len);
if(c<0){ printf("accept<0\n"); continue; }
int i;
pthread_mutex_lock(&m);
for(i=0;i<MAX&&cs[i].s!=0;i++) ;//这里的冒号不要忘了,否则无法正常运行!
if(i==MAX)
{
write(c,"full\n",5);
close(c);
}
else
{
cs[i].s=c;
inet_ntop(AF_INET,&si.sin_addr,cs[i].ip,16);
pthread_t id;
pthread_create(&id,NULL,func,&cs[i]);
}
pthread_mutex_unlock(&m);
}
}
- unix高级编程-多人聊天程序
- UNIX高级环境编程的程序说明
- (转载)unix环境高级编程 -- APUE中的第一个程序-myls如何才能运行
- UNIX高级环境编程(第二版)程序运行
- unix 环境高级编程-1.6-程序和进程
- UNIX高级环境编程(第二版)程序运行
- 《Unix环境高级编程》:线程清理处理程序
- 《Unix环境高级编程》:将文件复制到分页程序
- 《Unix环境高级编程》:使用popen调用过滤程序
- UNIX环境高级编程——第一个程序
- 《unix环境高级编程》书中程序编译环境配置
- Unix环境高级编程读书笔记(1):c程序进程空间布局
- unix高级编程-多路IO select
- 《UNIX环境高级编程》
- unix环境高级编程
- 《高级UNIX编程》读书笔记
- unix环境高级编程
- 高级Unix编程-基本概念
- 九度OJ 1525 子串逆序打印 -- 2012年Google校园招聘笔试题目
- Bootloader
- C和C++混合编程
- Java集合类
- android杀死进程
- unix高级编程-多人聊天程序
- 十款Unity相关开发插件和工具
- 继承 封装
- UML之时序图
- nbut [1223] Friends number 好题,打表法的求每个数的因子和
- XCode下调试模式对象显示的值有问题解决办法
- Java转型
- 最少拦截系统
- 大量加载树结构的思路