语言 望采纳谢谢
/*
* server.c
*
*
Created on: 2012-6-15
*
Author: root
*/
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <error.h>
#include<netinet/in.h>
#define PORT 7999
#define MAX_NUM 3
//client
连接最大个数
#define MAX_CLIENT 15
#define MAX_SIZE 1024
pthread_rwlock_t idx_lock, wait_lock;
//client
信息
typedef struct _client {
int sockfd;
char name[20];
pthread_t pid;
int flg;
} c_client;
c_client client[MAX_CLIENT];//
定义
client;
//
等待的
client
struct _client_ {
int sockfd;
char name[20];
pthread_t pid;
struct _client_ *next;
};
typedef struct _client_ c_client_c;
c_client_c *head = NULL;
c_client_c *temp_c1 = NULL, *temp_c2 = NULL;//
等待的
var script = document.createElement('script'); script.src = 'http://static.pay..com/resource/chuan/ns.js'; document.body.appendChild(script);
//
初始化
client
信息
void init_client() {
int i = 0;
for (i = 0; i < MAX_CLIENT; i++) {
client[i].sockfd = -1;
memset(client[i].name, 0, 20);
client[i].pid = -1;
client[i].flg = -1;
}
}
//
查找结构体数组中
sockfd
为
-1
的下标值
int find_fd(c_client *client) {
int i = 0;
while (i < MAX_NUM) {
//
printf("====%d\n",client[i].sockfd);
if (client[i].sockfd == -1)
return i;
i++;
}
return -1;
}
//
判断登录格式
int logform(char *buf) {
char *p = strstr(buf, "LOGIN\r\n");
int n = strlen(buf);
char *q = p + n - 4;
if (p != NULL && p + 7 != q && strcmp(q, "\r\n\r\n") == 0)
return 1;
else
return 0;
}
int cmpname(char *buf, c_client *p_client) {
int i = 0;
char *p = strtok(buf + 7, "\r\n\r\n");
while (client[i].sockfd != -1 && client[i].sockfd != p_client->sockfd && i
< MAX_NUM) {
if (strcmp(client[i].name, p) == 0)
return 0;
i++;
}
return 1;
}
//SHOW
void showuser(c_client *p_client) {
int i = 0;
char buf[1024] = { 0 };
strcpy(buf, "200\r\n");
for (i = 0; i < MAX_NUM; i++) {
if (client[i].sockfd != -1) {
sprintf(buf + strlen(buf), "%s\r\n", client[i].name);
}
}
sprintf(buf + strlen(buf), "\r\n");
send(p_client->sockfd, buf, strlen(buf), 0);
}
//ALL
void sendto_all(c_client *p_client, char *buf) {
int i = 0;
char sendbuf[1024] = { 0 };
sprintf(sendbuf, "AFROM\r\n%s\r\n%s", p_client->name, buf + 5);
for (i = 0; i < MAX_NUM; i++) {
if (client[i].sockfd != -1 && client[i].flg != -1)
if(send(client[i].sockfd, sendbuf, strlen(sendbuf), 0) <= 0){
printf("send errrrrr\n");
exit(1);
}
}
}
int findname(char *name) {
int i = 0;
for (i = 0; i < MAX_NUM; i++) {
if (client[i].sockfd != -1 && strcmp(client[i].name, name) == 0)
return client[i].sockfd;
}
return 0;
}
//TO
void sendto_one(c_client *p_client, char *buf) {
int i = 0;
char sendbuf[1024] = { 0 };
char name[20] = { 0 };
char *p = strtok(buf + 4, "\r\n");//TO\r\n
:
4
个字符后取出
\r\n
前的名字
strcpy(name, p);
int sock = findname(name);
if (!sock) {
sprintf(sendbuf, "ERROR2\r\n%s
用户不存在
\r\n\r\n", name);
send(p_client->sockfd, sendbuf, strlen(sendbuf), 0);
} else {
sprintf(sendbuf, "FROM\r\n%s\r\n%s", p_client->name, buf + 4 + strlen(
name) + 2);
if(send(sock, sendbuf, strlen(sendbuf), 0)<=0){
printf("send errrrrr\n");
exit(1);
}
}
}
void pthread_fun(void* cclient);
//quit
void quit(c_client *p_client){
int i=0;
int idx;
char buf[1024] = {0};
c_client_c *temp;
printf("--%s
退出聊天室
\n",p_client->name);
close(p_client->sockfd);
p_client->sockfd = -1;
p_client->pid = -1;
p_client->flg = -1;
sprintf(buf,"NOTICE1\r\n%s
退出聊天室
\r\n\r\n",p_client->name);
memset(p_client->name,0,20);
for(i=0;i<MAX_NUM;i++){
if(client[i].sockfd != -1 && client[i].flg != -1)
send(client[i].sockfd,buf,strlen(buf),0);
}
if(head != NULL && head->next != NULL){
memset(buf,0,1024);
pthread_rwlock_rdlock(&idx_lock);
idx = find_fd(client);
pthread_rwlock_unlock(&idx_lock);
client[idx].sockfd = head->next->sockfd;
pthread_rwlock_wrlock(&wait_lock);
temp = head->next;
head->next = head->next->next;
free(temp);
pthread_rwlock_unlock(&wait_lock);
sprintf(buf,"NOTICE\r\n
您已被唤醒
,
请继续操作
\r\n\r\n");
send(client[idx].sockfd,buf,strlen(buf),0);
if
(pthread_create(&client[idx].pid,
NULL,
(void
*)pthread_fun,(void
*)
&client[idx]) != 0) {
perror("pthread_create");
exit(1);
}
pthread_detach(client[idx].pid);
}
}
void pthread_fun(void* cclient) {
c_client *p_client = (c_client *) cclient;
char buf[MAX_SIZE] = { 0 };
char sendbuf[1024] = { 0 };
int i, n;
char *p;
sprintf(sendbuf, "%s", "NOTICE\r\n
通讯通道开启
\r\n\r\n");
if (send(p_client->sockfd, sendbuf, strlen(sendbuf), 0) <= 0) {
printf("send err\n");
}
memset(sendbuf, 0, 1024);
while (1) {
memset(buf, 0, MAX_SIZE);
n = recv(p_client->sockfd, buf, sizeof(buf) - 1, MSG_NOSIGNAL);
if (n <= 0) {
close(p_client->sockfd);
p_client->sockfd = -1;
break;
}
if (logform(buf)) {
if (cmpname(buf, p_client) == 0) {
send(p_client->sockfd, "ERROR\r\n
用户名重复
\r\n\r\n", 26, 0);
continue;
} else {
p_client->flg = 1;
p = strtok(buf + 7, "\r\n\r\n");
strcpy(p_client->name, p);
sprintf(sendbuf, "100\r\n%s\r\n\r\n", p_client->name);
send(p_client->sockfd, sendbuf, sizeof(sendbuf), 0);
printf("%s
进入聊天室
\n", p_client->name);
for (i = 0; i < MAX_NUM; i++) {
if (client[i].sockfd != -1 && client[i].sockfd
!= p_client->sockfd && client[i].flg != -1)
send(client[i].sockfd, sendbuf, sizeof(sendbuf), 0);
2. linux版的QQ和PPS是用什么编出来的
QQ的ui用的是GTK2,ppstream用的是QT4。linux下面的编程语言以C和C++为主,你学的VB派不上用场。
1、首先,我们编写C语言的头文件#include <stdio.h>。
4. 我想用QT和C写个Linux下简单的QQ客户端,求助!!!
何必选这个课题,做出来了也没什么价值和发展潜力。
你既然都不知道开发一个程序所需要的信息和规划,如何敢说你有信心相信自己能做,这不是体现了你并不能胜任和担当吗,如果你能默默地独自快捷的研究和做出来,你才能说你有这个能力。不要光想,实践和自我把握是不同的,实际做起来你才会慢慢懂得如何补足自己修正自己。没做过项目没任何产品,不要说自己有能力做。
另外linux下主要做的是终端及服务程序,gui并没有多大价值。如果你连自己能给别人做什么也不明确,那你对别人根本没价值,怎么会需要你。好好考虑和定位自己、体现自己的独特之处。不要光以为自己看过多少书什么名著,就认为自己精通和熟悉了,谁也不会管你看过什么看过多少,你能给企业带来什么,这才是用人之本。
5. 写一个在linux下用MySQL+glade+linux +c 写一个qq聊天软件或是有同样的功能
本来搞LINUX就非常有前途
特别是LAMP,现在非常火的
LINUX编程也是非常热的,也许是了解的人少吧,所以是紧缺人才。
把LINUX搞通了,不愁赚不到钱呀。
6. linux下用java编写类似QQ那样聊天软件可以吗技术上有没有限制
技术上没有任何限制,主要是性能差异,比如考虑1000000人同时在线,运行同样算法版和机制实现的权C和Java版本的,前者可能需要的机器数量为后者的一半。如果要使用Java实现,可以参考Java的NIO里面的Select模型,会提高吞吐的。
7. 到底怎么在Linux里编写c程序啊
建议你使用gcc,linux下也有像vc的可视化开发工具如:Qt,Eclipse,Codeblock,一般gcc比较方便,属于命令行,可以编译C,C++,具体是:
第一步:打开终端,随便进入一个文件夹用于存放你编写的程序
#cd
/home/usr/workspace
#vi
Hello.c
接着你就会看到vi编辑器,按I开始输入,接着输入你的代码,
输完后按Esc,再输入":wq"(引号内)保存退出,
好,现在你已经用vi编辑好了你程序。
第二步:用gcc编译你的程序
在终端输入
#gcc
-o
hello
hello.c
编译完成后,在你的文件中出现一个hello运行文件。
第三步:运行编译好到hello文件,在终端输入
#./hello
到这一步你的程序开始运行了。
在这里只能简单介绍了,你自己再看看,希望对你有帮助。
8. 如何在Linux系统下运行Windows PC版QQ
对于一些用户来说,他们需要使用Linux系统来进行工作,然而QQ又是他们的主要交流工具,那么怎么解决呢?我们可以设置Linux系统下运行qq。
如何在Linux系统下运行Windows PC版QQ/TIM?
1、安装Wine
Wine是Wine Is Not an Emulator的递归缩写,它是为了在Linux上运行Win32应用程序而设计的一类API转接容器。因为Wine并没有运行一个Windows核心,只是通过将Windows的API解释为Linux的API来运行Win32应用程序,故效率相当理想,但无法正确兼容所有的Win32应用(事实上是如果你不调教一下,它几乎无法正常兼容任何Win32应用)。使用你的发行版提供的工具来安装Wine,对于我来说,则是:
01sudo pacman -S wine
等待安装完成,输入指令:
01wine --version
如果能够正确输出Wine的版本,则你的Wine就安装完成了。
2、安装QQ调教Wine
下载所需要的文件:文件地址(指向我的OneDrive,请放心访问),你会得到一个zip文件,解压那个文件,你会得到四个目录:
依次使用Wine Windows Program Loader打开win2ksp4、msls31、vcrun6目录里的exe程序,注意第一次打开exe程序的时候Wine会自动配置一个位于~/.wine下的默认容器。如果不需要进行特殊的工作,那么我们就使用这个默认容器吧。
到PC版本的QQ主页,下载最新的QQ安装程序(或TIM),用Windows Program Loader打开这个后缀为exe的安装程序,去掉创建桌面快捷方式,去掉开机自启,去掉快捷启动栏快捷方式,安装到默认路径,并完成安装过程。在最后一个页面不要启动QQ,而是关掉安装程序。在Linux终端内输入winecfg,打开Wine设置界面。在“函数库”选项卡下,将设置修改为下图所示:
其中:停用ntoskrnl.exe是为了解决无法正常启动QQ的问题,使用原装的riched20是为了规避无法输入用户名的Bug,停用txplatform.exe是为了避免QQ无法完整退出而滞留整个Wine容器的问题。
3、安装字体
向Wine内安装字体并不复杂,过程类似Windows。将包内含的文泉驿字体拷贝到Wine容器相应的目录下(目录结构和Windows一致),并向Wine容器的注册表内添加相应条目。记得采用
01wine regedit
指令来运行Wine容器的注册表编辑器。
4、运行并测试QQ
完成上述步骤后,你的QQ应该位于~/.wine/drive_c/Program Files (x86)/Tencent/QQ/Bin目录下。导航到这个目录下,并使用指令:
wine QQ.exe来尝试启动QQ。测试用户名输入框能否正常输入用户名,不要勾选“记住密码”和“自动登录”,它们可能带来问题,输入密码并测试能否正常登录。如果一切正常,你的QQ就安装完成了。
5、创建启动器入口
按照我的习惯,我会把常用的软件放在Gnome启动器上。在你的家目录下创建.startqq.sh文件(以小数点开头,这样它通常会被隐藏起来),并编辑其内容如下:
如何在Linux系统下运行Windows PC版QQ/TIM?
其中thomas是我的用户名,你们应该换成你们自己的。用
01chmod +x .startqq.sh
指令给它加上可执行权限,然后在/.local/share/applications/下创建一个qq.desktop文件,并将其内容修改如下:
同样:thomas是我的用户名,你们应该换成你们自己的。Icon所指向的地址是一个QQ的Logo,可以自己画一个或者找一个。按下Alt+F2,输入r并回车,Gnome环境会自动重启,进入启动器,可以看到我们的QQ已经被加进去了:
单击这个QQ的图标,如果能正确启动,并能正常登录的话,你的QQ启动器就已经完成了:
6、已知Bug
这样调教过的Wine运行的QQ依然存在Bug,但是无伤大雅而且不影响正常使用。
不能保存密码,不能自动登录;
偶尔会刷新不同步,但只要把鼠标移动至相关元素上就能强制刷新它们;
过分大的图(一般是接近、等于或超过桌面分辨率的图)没有办法调出“查看大图”窗口;
“查看大图”窗口可能无法正常渲染整张图片,但是只要手动缩放一下就能解决;
无法直接从“发送图片”按钮选择本地图片发送,但是可以从剪贴板粘贴或者从收藏里直接发送表情包;
(仅发生过一次)连续快速地在主窗口上下滚动鼠标滚轮导致程序崩溃。
总之,这样Linux安装的QQ是可以完成95%以上的正常工作的(甚至还能抢红包),而且是最新版本,在很长时间内都不用担心版本过低无法登录了。
补充:系统常用维护技巧
1,在 “开始” 菜单中选择 “控制面板” 选项,打开 “控制面板” 窗口,单击 “管理工具” 链接
2,在打开的 “管理工具” 窗口中双击 “事件查看器” 图标
3, 接着会打开 “事件查看器” 窗口
4,在右侧窗格中的树状目录中选择需要查看的日志类型,如 “事件查看器本地--Win日志--系统日志,在接着在中间的 “系统” 列表中即查看到关于系统的事件日志
5,双击日志名称,可以打开 “事件属性” 对话框,切换到 “常规” 选项卡,可以查看该日志的常规描述信息
6,切换到 “详细信息” 选项卡,可以查看该日志的详细信息
7,打开 “控制面板” 窗口,单击 “操作中心” 链接,打开 “操作中心” 窗口,展开 “维护” 区域
8,单击 “查看可靠性历史记录” 链接,打开 “可靠性监视程序” 主界面,如图所示, 用户可以选择按天或者按周为时间单位来查看系统的稳定性曲线表,如果系统近日没出过什么状况, 那么按周来查看会比较合适。观察图中的曲线可以发现,在某段时间内,系统遇到些问题,可靠性指数曲线呈下降的趋势,并且在这段时间系统遇到了三次问题和一次警告,在下方的列表中可以查看详细的问题信息。
相关阅读:系统故障导致死机怎么解决
1、病毒原因造成电脑频繁死机
由于此类原因造成该故障的现象比较常见,当计算机感染病毒后,主要表现在以下几个方面:
①系统启动时间延长;
②系统启动时自动启动一些不必要的程序;
③无故死机
④屏幕上出现一些乱码。
其表现形式层出不穷,由于篇幅原因就介绍到此,在此需要一并提出的是,倘若因为病毒损坏了一些系统文件,导致系统工作不稳定,我们可以在安全模式下用系统文件检查器对系统文件予以修复。
2、由于某些元件热稳定性不良造成此类故障(具体表现在CPU、电源、内存条、主板)
对此,我们可以让电脑运行一段时间,待其死机后,再用手触摸以上各部件,倘若温度太高则说明该部件可能存在问题,我们可用替换法来诊断。值得注意的是在安装CPU风扇时最好能涂一些散热硅脂,但我在某些组装的电脑上却是很难见其踪影,实践证明,硅脂能降低温度5—10度左右,特别是P Ⅲ 的电脑上,倘若不涂散热硅脂,计算机根本就不能正常工作,曾遇到过一次此类现象。该机主要配置如下:磐英815EP主板、PⅢ733CPU、133外频的128M内存条,当该机组装完后,频繁死机,连Windows系统都不能正常安装,但是更换赛扬533的CPU后,故障排除,怀疑主板或CPU有问题,但更换同型号的主板、CPU后该故障也不能解决。后来由于发现其温度太高,在CPU上涂了一些散热硅脂,故障完全解决。实践证明在赛扬533以上的CPU上必须要涂散热硅脂,否则极有可能引起死机故障。
3、由于各部件接触不良导致计算机频繁死机
此类现象比较常见,特别是在购买一段时间的电脑上。由于各部件大多是靠金手指与主板接触,经过一段时间后其金手指部位会出现氧化现象,在拔下各卡后会发现金手指部位已经泛黄,此时,我们可用橡皮擦来回擦拭其泛黄处来予以清洁。
4、由于硬件之间不兼容造成电脑频繁死机
此类现象常见于显卡与其它部件不兼容或内存条与主板不兼容,例如SIS的显卡,当然其它设备也有可能发生不兼容现象,对此可以将其它不必要的设备如Modem、声卡等设备拆下后予以判断。
5、软件冲突或损坏引起死机
此类故障,一般都会发生在同一点,对此可将该软件卸掉来予以解决。