導航:首頁 > 編程系統 > 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相關的資料

熱點內容
ps3文件分割視頻 瀏覽:280
微信圖片一鍵轉發軟體 瀏覽:331
如何判斷s200plc編程電纜 瀏覽:691
太原編程培訓班哪個好 瀏覽:171
樹葉吹奏教程 瀏覽:6
社交app帶來了哪些社會問題 瀏覽:394
如何安裝愛寶8800數據採集器 瀏覽:712
文件保存了怎麼找不到了 瀏覽:476
彩票網站怎麼辨真假 瀏覽:840
pr找不到該文件 瀏覽:963
java移除panel 瀏覽:354
jsp填充jsp 瀏覽:166
海關外貿大數據在哪裡查 瀏覽:381
思特奇java筆試題 瀏覽:121
葫蘆俠在手機中的文件名 瀏覽:813
plc編程應該怎麼收錢 瀏覽:584
c語言中源文件由什麼組成 瀏覽:890
linuxhttpdphp配置文件 瀏覽:607
拆單數據要怎麼保存 瀏覽:17
mac電腦怎樣壓縮文件到100m 瀏覽:645

友情鏈接