語言 望採納謝謝
/*
* 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、軟體沖突或損壞引起死機
此類故障,一般都會發生在同一點,對此可將該軟體卸掉來予以解決。