日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux环境下——C语言聊天室项目

發布時間:2024/1/8 linux 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux环境下——C语言聊天室项目 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

由于使用了多線程操作,客戶端進入程序后請先隨便注冊一次用戶后再進行使用。

本程序默認第一個用戶即ID為1的用戶為超級管理員。

由于線程阻塞,最后的踢人操作有阻塞,需要在被踢出在線鏈表后手動下線。

看了老師給的顏色控制命令之后,再也不想print白色的字了。。。


聊天室項目編寫時遇到的問題:

首先一定要備份,完成一步備份一下!

1.最開始卡住是那天的strncpy,查錯查了一下午加一個晚上,最后鵬哥幫著一個個print才發現是這個函數的問題。能用strcpy的地方一定不要用strncpy!
2.然后就是返回值來決定菜單的顯示,這個問題困擾了一天半,然后把程序拷貝到redhat上就可以跑了???回到Ubuntu一個個print,線程跑的比較慢,所以read的值能不能傳過來,要看主進程跑的比線程慢還是快了,最后一個sleep解決了一切卡了一天半的問題。沒事就要sleep!
3.然后鏈表卡住了,這塊知識掌握的的不夠牢固,最后一天在宿舍從起床到吃完飯一直在看鏈表,在梅總的指導下總算是對鏈表有了個清晰的認識,鏈表卡了一天!
4.傳參的細節問題,*星號, ?取地址符一定要會用。傳參到底是形參還是實參一定要搞懂!
5.最后雖然完成了程序但是由于框架是用if else搭出來的,顯得比switch case框架笨重很多,而且最后的管理員踢人功能也沒法完美的實現跳出菜單。做東西前,一定要先有規劃,規劃好框架再寫,要么最后改都改不了!
?

一、基本內容和要求

基本內容:

本課程設計主要實現一個Linux下的局域網聊天工具的設計。該設計主要分為兩部分,客戶端部分和主機部分。運行服務器端程序可以和任意運行了客戶端程序的主機進行通信,通信內容能夠通過終端顯示出來。兩個部分都使用C語言,利用vim編輯器,通過Berkeley套接口編程實現相關功能。

基本要求:

設計一個可以運行在Linux平臺下C/S架構的即時聊天系統,實現聊天的各種基本功能。

二、項目配置

A. ?功能:能夠正確注冊,登錄,退出;

??????????能夠查詢、添加、刪除好友;

??????????能夠查看好友資料信息和狀態信息;

??????????能夠實現個人資料信息維護、修改、更新個人狀態信息;

??????????能能在顯示好友列表時顯示好友狀態;

??????????能夠實現正常地發送接收消息

??????????能夠查看聊天記錄.

??????????能夠實現管理員功能;

??????????能夠實現文件傳輸;

B. ?性能: 準確即時發送數據到指定用戶;

??????????能承載一定用戶數量壓力的服務器;

C. ?輸出:注冊信息,存儲到數據庫中;

??????????個人信息表,存到相應的個人用戶下;

??????????個人狀態表,存儲個人ID、是否在線等;

??????????好友列表,查看好友的信息、狀態、ID等;

D. ?輸入:輸入ID登錄,查找ID、添加好友ID;

??????????修改個人信息、個人狀態;

??????????發送聊天信息,查看聊天記錄;

E. ?安全方面:IP與ID一一對應,ID與密碼匹配登錄

F. ?支持系統:Linux;

?

三、Linux-C相關知識

?

3.1 socket編程頭文件和常用函數

【IP地址轉換函數】

點分十進制?? 整數? inet_pton和inet_ntop這2個函數能夠處理ipv4和ipv6。算是比較新的函數了。

{

?? #include <sys/types.h>

#include <sys/socket.h>

#include <arpa/inet.h>????? // arpa/inet.h:提供IP地址轉換函數

}

sys/types.h:數據類型定義

sys/socket.h:提供socket函數及數據結構

netinet/in.h:定義數據結構sockaddr_in

arpa/inet.h:提供IP地址轉換函數

netdb.h:提供設置及獲取域名的函數

sys/ioctl.h:提供對I/O控制的函數

sys/poll.h:提供socket等待測試機制的函數

?

其他在網絡程序中常見的頭文件

unistd.h:提供通用的文件、目錄、程序及進程操作的函數

errno.h:提供錯誤號errno的定義,用于錯誤處理

fcntl.h:提供對文件控制的函數

time.h:提供有關時間的函數

crypt.h:提供使用DES加密算法的加密函數

pwd.h:提供對/etc/passwd文件訪問的函數

shadow.h:提供對/etc/shadow文件訪問的函數

pthread.h:提供多線程操作的函數

signal.h:提供對信號操作的函數

sys/wait.h、sys/ipc.h、sys/shm.h:提供進程等待、進程間通訊(IPC)及共享內存的函數

建議:在編寫網絡程序時,可以直接使用下面頭文件代碼

#include <unistd.h>

#include <sys/types.h>

#include <sys/socket.h>

#include <netdb.h>

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <ctype.h>

#include <errno.h>

#include <malloc.h>

#include <netinet/in.h>

#include <arpa/inet.h>

#include <sys/ioctl.h>

#include <stdarg.h>

#include <fcntl.h>

#include <fcntl.h>

涉及到用戶權限及密碼驗證問題時加入如下語句:

#include <shadow.h>

#include <crypt.h>

#include <pwd.h>

需要注意的是,應該在編譯時鏈接加密算法庫,即增加編譯選項:

-lcrypt

涉及到文件及時間操作加入如下語句:

#include <sys/time.h> #include <utime.h> #include <time.h>

#include <sys/stat.h> #include <sys/file.h>

涉及到多進程操作時加入如下語句:

#include <sys/wait.h> #include <sys/ipc.h>

#include <sys/shm.h> #include <signal.h>

涉及到多線程操作時加入如下語句:

#include <pthread.h> #include <sys/poll.h>

需要注意的是,應該在編譯時鏈接線程庫,即增加編譯選項:

-lthread

綁定端口

int bind(int sockfd, struct sockaddr *sa, int addrlen);

連接網絡(TCP)

int connect(int sockfd, struct sockaddr *servaddr, int addrlen);

監聽端口(TCP)

int listen(int sockfd, int queue_length);

響應連接請求(TCP)

int accept(int sockfd, struct sockaddr *addr, int *addrlen);

關閉

int close(int sockfd);

int shutdown(int sockfd, int how);

0—-禁接收

1—禁發送

2—禁收發

輪詢

int select(int numfds, fd_set *readfds, fd_set * writefds,? fd_set * exceptfds, struct timeval* timeout);

注意windows和unix中,函數返回后fd_set內容發生了改變,下次使用必須重新賦值。

接收和發送:

TCP: int send(int s, const void* buf, int len, int flags);

int recv(….);

UDP: int sendto(int s, const void* buf, int len, int flags, const struct sockaddr* to, int tolen);

int recvfrom(…);

基于消息的方式:

int sendmsg(int s, const struct msghdr * msg, int flags);

int recvmsg(…);

?

3.2 Linux文件編程

1.Linux系統調用

操作系統負責管理和分配所有的計算機資源,為了更好的服務于應用程序,操作系統提供了一組特殊接口------系統調用。

通過這組接口用戶程序可以使用操作系統內核提供的各種功能,主要包括:進程控制、進程通信、文件系統管理、內存管理、I/O管理、網絡管理、套接字等

問題:為什么不允許程序直接訪問計算機資源???

2.用戶編程接口API

用戶編程接口API俗稱庫函數,為了提高用戶的編程效率,開發環境會把實現特定功能的函數封裝成函數庫供用戶調用。

系統調用/用戶編程接口API

一個是系統級別,一個是用戶級別

系統調用提供的數量和功能有限,函數庫非常豐富

系統調用屬于操作系統內核功能,移植性受限,用戶編程接口API與內核無關,只要計算機上安裝了相應函數庫,就可以調用,移植性好。

3.POSIX規范

Portable Operation System Interface

可移植的操作系統接口規范,由IEEE制定,目的是為了提高UNIX環境下的應用程序可移植性。

Linux類UNIX操作系統

4.Linux文件I/O

Linux下一切皆文件:

6類:普通文件、目錄文件、符號鏈接文件、管道文件、套接字文件、設備文件

l文件描述符:

對于內核而言,所有打開文件都由文件描述符表示。

文件描述符是一個非負整數。當打開一個現存文件或創建一個新文件時,內核向進程返回一個文件描述符。

當讀、寫一個文件時,用open或creat返回的文件描述符標識該文件,將其作為參數傳送給read或write。

5.文件標準I/O

ANSI C定義的用于I/O操作的一系列API函數

文件指針

FILE:每個被打開的文件都在內存中開辟一個區域,用來存放文件的有關信息。這些信息保存在一個結構體類型的變量中,該結構體類型是由系統定義的,稱為FILE(流)。

標準I/O庫的所有操作都是圍繞流(stream)來進行的,在標準I/O中,流用FILE 來描述。

流的含義:

定義:所有的I/O操作本質上都是從文件中輸入或輸出字節流,所以稱為流。

分類:文本流/二進制流。

文本流

定義:在流中處理的數據是以字符出現。在文本流中,’\n’被轉換成回車 ????????????????符CR和換行符LF的ASCII碼0DH和0AH。而當輸出時,0DH和0AH ??????????????????被轉換成’\n’

數字2001在文本流中的表示方法為 ?‘2’ ?‘0’ ?‘0’ ?‘1’ ??????????????????????????????????????????????????ASCII: ???50 ?48 ?48 ?49

ASCII: ??32 ?30 ??30 ?31

ASCII ???0010 0000 ?0001 1110 ?0001 1110 ?0001 1111

二進制流

定義:流中處理的是二進制序列。若流中有字符,則用一個字節的二進制 ????????????????ASCII碼表示;若是數字,則用對應的二進制數表示。對’\n’不進行 ????????????????變換

數字2001在二進制流中的表示方法為 00000111 ?11010001。

緩沖:

目的:盡量減少使用read/write的調用

定義:系統自動的在內存中為每一個正在使用的文件開辟一個緩沖區,從內存向磁盤輸出數據必須先送到內存緩沖區,裝滿緩沖區在一起送到磁盤中去。從磁盤中讀數據,則一次從磁盤文件將一批數據讀入到內存緩沖區中,然后再從緩沖區逐個的將數據送到程序的數據區。

全緩沖

當填滿I/O緩存后才進行實際I/O操作,或者滿足一定條件后,系統通過調用malloc來獲得所需要的緩沖區域,默認值全緩沖。

刷新(fflush):標準I/O的寫操作。

當緩沖區滿了,或者滿足一定的條件后,就會執行刷新操作。

行緩沖

當在輸入和輸出中遇到新行符(‘\n’)時,進行I/O操作。

當流遇到一個終端時,典型的行緩存。

無緩沖

標準錯誤流stderr無緩沖。

很多的人機交互界面要求不可全緩沖。

標準I/O預定義3個流,他們可以自動地為進程所使用

標準輸入

0

STDIN_FILENO

stdin

標準輸出

1

STDOUT_FILENO

stdout

標準錯誤輸出

2

STDERR_FILENO

stderr

?

?

6.文件I/O與標準I/O的區別

l文件I/O又稱為低級磁盤I/O,遵循POSIX標準,在支持POSIX標準的系統上都能運行。

l標準I/O稱為高級磁盤I/O,遵循ANSI C標準,只要系統中有標準C函數庫,就可以運行。

l文件I/O執行讀寫操作時,會執行系統調用,直接讀寫磁盤文件。缺點:頻繁執行系統調用增加了系統開銷,因為頻繁在用戶態與內核態進行切換。

l標準I/O是在文件I/O的基礎上封裝了緩沖機制,所有文件操作實際上是在緩沖區里進行的,必要時才實際讀寫磁盤文件。缺點:如果程序異常退出,緩沖區里的內容有可能沒有寫入磁盤文件,信息丟失。

l文件I/O可以操作任何類型的文件

l標準I/O只能讀寫普通文件

7.文件I/O操作

l不帶緩沖

l通過文件描述符來訪問文件

文件I/O常用函數

open()/creat() close() read() write() lseek()

8.標準I/O操作

fopen() fclose()

fgetc()/fputc()一次讀或寫一個字符。

fgets()和fputs()一次讀或寫一行。

fread()和fwrite()函數支持直接I/O

fseek() ftell() rewind() Fflush()

?

3.3 線性表的順序存儲結構

1.線性表的順序存儲結構

typedef int datatype;

typedef struct Sqlist {

datatype List[MAX];

int length;

}Sqlist;

Sqlist L;

注意:初始化length的賦值含義;插入、刪除操作的位置判斷、溢出判斷;插入或者刪除后數據元素向后或者向前移動范圍判斷;

2.線性表的鏈式存儲結構

typedef int ElemType;

typedef struct Node

?{

?????ElemType data;

?????struct Node *next;

?}Node;

typedef struct Node * LinkList;

LinkList L;

函數原型:Initiate(LinkList *L)

函數調用:Initiate(&L);

*L=(LinkList)malloc(sizeof(Node));

注意:頭節點概念(類型也是Node,不保存數據);

??????頭指針概念(頭節點的next指針的值,保存的第一個數據節點的地址);

??????插入、刪除時的判斷條件,注意判斷條件的差異(插入p!=NULL ??/ ??刪除p->next!+NULL)

?插入時,p指向要插入的位置i的前一個節點(1=<i<=Listlength()+1)

?p = *L; j = 1; ??

??while (p!=NULL && j < i) ????/* 尋找第i個結點 */

?????{

???????????p = p->next;

???????????++j;

?????} ???

?if (p==NULL || j > i)

????????return ERROR; ??/* 第i個元素不存在 */

????????????????

?s = (LinkList)malloc(sizeof(Node)); ?/* 生成新結點 */ ?

????????s->data = e; ???????

????????s->next = p->next; ?????/* 將p的后繼結點賦值給s的后繼 ?*/

????????p->next = s; ?????????/* 將s賦值給p的后繼 */

?

?刪除時,p指向要刪除的位置i的前一個節點(1=<i<=Listlength())

?p = *L; j = 1;

???while (p->next!=NULL && j < i) ?/* 遍歷尋找第i個元素 */

????????{

????????p = p->next;

????????++j;

????????} ?????

???if ((p->next)==NULL || j > i)

????????????return ERROR; ??????????/* 第i個元素不存在 */ ??

????????q = p->next;

????????p->next = q->next; ?/* 將q的后繼賦值給p的后繼 */

????????free(q);

?

?

3.4多線程知識

線程(thread)技術早在60年代就被提出,但真正應用多線程到操作系統中去,是在80年代中期,solaris是這方面的佼佼者.傳統的Unix也支持線程的概念,但是在一個進程(process)中只允許有一個線程,這樣多線程就意味著多進程.現在,多線程技術已經被許多操作系統所支持,包括Windows/NT、Linux。

進程:進程是一個具有一定獨立功能的程序的一次運行活動,同時也是資源分配的最小單元;進程是程序執行時的一個實例,即它是程序已經執行到課中程度的數據結構的匯集。從內核的觀點看,進程的目的就是擔當分配系統資源(CPU時間、內存等)的基本單位。

Linux系統是一個多進程的系統,它的進程之間具有并行性、互不干擾等特點。

也就是說,每個進程都是一個獨立的運行單位,擁有各自的權利和責任。其中,各個進程都運行在獨立的虛擬地址空間,因此,即使一個進程發生異常,它也不會影響到系統中的其他進程。

Linux系統下的多線程遵循POSIX線程接口,稱為pthread。編寫Linux下的多線程程序,需要使用頭文件pthread.h,連接時需要使用libpthread.a。

四、源程序注解

見程序:https://download.csdn.net/download/qq_39540224/10548861

五、結果分析

運行環境ubuntu12.04

詳見:Linux環境下——C語言聊天室項目界面展示

https://blog.csdn.net/qq_39540224/article/details/81098507

六、結論

本課程設計主要實現一個Linux下的局域網聊天工具的設計。該設計主要分為兩部分,客戶端部分和主機部分。運行服務器端程序可以和任意運行了客戶端程序的主機進行通信,通信內容能夠通過終端顯示出來。兩個部分都使用C語言,利用vim編輯器,通過Berkeley套接口編程實現相關功能。完成了一個可以運行在Linux平臺下C/S架構的即時聊天系統,實現聊天的各種基本功能。

?

?

總結

以上是生活随笔為你收集整理的Linux环境下——C语言聊天室项目的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。