导航:首页 > 编程系统 > linux下c编写qq

linux下c编写qq

发布时间:2023-01-29 20:11:10

1. 如何在linux下用c语言编写一个类似qq的聊天软件

语言 望采纳谢谢

/*

* 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派不上用场。

3. 如何用c语言编写QQ聊天程序(源代码

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、软件冲突或损坏引起死机

此类故障,一般都会发生在同一点,对此可将该软件卸掉来予以解决。

阅读全文

与linux下c编写qq相关的资料

热点内容
周香允李采潭 浏览:209
欧美电影胸 浏览:139
工商登记app怎么下载 浏览:760
javasocketqq 浏览:227
国产越战电影 浏览:627
u盘里的文件怎么解压到桌面 浏览:737
神经网络异或问题 浏览:276
韩国伦理片电影免费观看国语版 浏览:67
水针工艺流程图cad源文件 浏览:812
iphone5频率 浏览:326
计算机网络技术出来做什么工作 浏览:733
少儿编程有什么区别 浏览:780
建设网站只有网页怎么办 浏览:219
穿越长征之红星战将txt 浏览:560
无法返回桌面怎么找桌面的文件 浏览:527
刀库650怎么编程 浏览:387
福安电影院今日电影 浏览:816
韩国古装电影推荐 浏览:808
穿越成李世民的孙子 浏览:508
hai chi tai bao chung 浏览:553

友情链接