基于Linux的網(wǎng)絡(luò)編程——網(wǎng)絡(luò)聊天程序
? ? ? ? 網(wǎng)絡(luò)聊天程序是目前應(yīng)用極為廣泛的一種網(wǎng)絡(luò)軟件,對于方便人們的交流溝通非常有效,同時,作為一種典型的網(wǎng)絡(luò)應(yīng)用,編寫網(wǎng)絡(luò)聊天程序是學(xué)習(xí)基于Linux的網(wǎng)絡(luò)編程的有效方法。
? ? ? ? 結(jié)合任務(wù)需求設(shè)計該程序,程序采用多線程方式實現(xiàn)不同主機(jī)之間的通信。除滿足基礎(chǔ)要求之外,還考慮到通信私密性及多用戶的問題,程序通過上鎖和解鎖,實現(xiàn)公開通信和隱秘通信兩種通信方式,客戶端輸入用戶名即可進(jìn)入隱秘通信模式,輸入ALL返回公開通信模式,默認(rèn)使用公開通信;通過設(shè)置用戶名變量,實現(xiàn)多用戶同時通信,在實現(xiàn)多用戶功能的同時,用戶過多輸入會使數(shù)據(jù)溢出,因此設(shè)置用戶上限以解決此問題,某一客戶端退出并不影響其他客戶的使用,所有用戶全部退出,服務(wù)器關(guān)閉端口,結(jié)束進(jìn)程。
? ? ? ?程序基于Linux系統(tǒng)開發(fā),純C語言Socket實現(xiàn)多個客戶端之間通信,由服務(wù)器端進(jìn)行數(shù)據(jù)處理,基本實現(xiàn)聊天功能的基礎(chǔ)運(yùn)用。
目錄
1? 設(shè)計目的? ? ??
2? 設(shè)計思路
2.1? 服務(wù)器主線程程序框架
2.2? 服務(wù)器連接客戶接發(fā)信息框架
2.3? 客戶端主線程程序框架
2.4? 客戶端信息接發(fā)程序框架
3? 設(shè)計測試
3.1? 公開通信模式
3.2? 隱秘通信模式
4? 主要代碼
4.1? 客戶端主函數(shù)代碼
4.2? 服務(wù)器主函數(shù)代碼
1? 設(shè)計目的? ? ??
? ? ? ? 在使用Linux線程和Socket接口的基礎(chǔ)上,編寫網(wǎng)絡(luò)聊天程序,從而掌握Linux應(yīng)用程序開發(fā)的基本方法,練習(xí)Linux線程及Socket編程的方法。
2? 設(shè)計思路
2.1? 服務(wù)器主線程程序框架

圖2.1 服務(wù)器主線程程序框圖
2.2? 服務(wù)器連接客戶接發(fā)信息框架

圖2.2 服務(wù)器連接客戶接發(fā)信息框圖
2.3? 客戶端主線程程序框架

圖2.3 服務(wù)器連接客戶接發(fā)信息框圖
2.4? 客戶端信息接發(fā)程序框架

圖2.4 服務(wù)器連接客戶接發(fā)信息框圖
3? 設(shè)計測試
? ? ? ?模擬四個用戶同時在線通信,分別自命名用戶1、用戶2、用戶3和用戶4。

圖3.1 服務(wù)器端顯示內(nèi)容圖

圖3.2 客戶端顯示內(nèi)容圖
3.1? 公開通信模式
? ? ? ?公開通信模式下,由任意用戶發(fā)送信息,其余用戶會同時收到信息內(nèi)容:

圖3.3 用戶1發(fā)送消息效果圖

圖3.4 用戶2發(fā)送消息效果圖
3.2? 隱秘通信模式
? ? ? ?隱秘模式下用戶輸入接收信息用戶名稱得以實現(xiàn)該用戶至目標(biāo)用戶單向信息隱秘通信,另一方若需要隱匿通信需要輸入該用戶名稱,實現(xiàn)雙向信息隱秘通信。

圖3.5 用戶1向用戶2隱秘通信效果圖


圖3.7 用戶3和用戶4之間進(jìn)行雙向隱秘通信效果圖
4? 主要代碼
4.1? 客戶端主函數(shù)代碼
int main(int argc, char* argv[])
{
? ? //創(chuàng)建套接字文件,返回套接字文件描述符 socket()
? ? sockfd = socket(AF_INET, SOCK_STREAM, 0);
? ? pthread_t tid;
? ? if (sockfd == -1)
? ? {
? ? ? ? perror("socket create failure\r\n");
? ? ? ? return 0;
? ? }
? ? //創(chuàng)建結(jié)構(gòu),初始化數(shù)據(jù) struct sockaddr? ? ? 使用 struct sockaddr_in
? ? SIN ser_addr;
? ? ser_addr.sin_family = AF_INET; //選擇ipv4協(xié)議族??
? ? ser_addr.sin_port = htons(PORT);? //端口號要轉(zhuǎn)換端緒,從小端緒轉(zhuǎn)換從大端緒
? ? ser_addr.sin_addr.s_addr = inet_addr(IP); //十進(jìn)制的字符ip轉(zhuǎn)換成網(wǎng)端數(shù)據(jù)格式 服務(wù)端IP
? ? int len = sizeof(ser_addr);
? ? if (connect(sockfd, (SA*)&ser_addr, len) == -1)
? ? {
? ? ? ? perror("connect failure\r\n");
? ? ? ? return 0;
? ? }
? ? else
? ? {
? ? ? ? printf("WELCOME TO DADONG TALK ROOM!\r\n");
? ? ? ? printf("Please sign you name:");
? ? ? ? char temp[20] = { 0 };
? ? ? ? memset(temp, 0, 100);
? ? ? ? scanf("%s", temp);
? ? ? ? send(sockfd, temp, strlen(temp), 0); //發(fā)送信息
? ? ? ? pthread_create(&tid, NULL, message, NULL);
? ? }
? ? char wbuf[100] = { 0 };
? ? while (1)
? ? {
? ? ? ? memset(wbuf, 0, 100);
? ? ? ? read(0, wbuf, 100);
? ? ? ? if (strncmp(wbuf, "quit", 4) == 0)
? ? ? ? {
? ? ? ? ? ? send(sockfd, wbuf, strlen(wbuf), 0);
? ? ? ? ? ? final = 1;
? ? ? ? ? ? close(sockfd);
? ? ? ? ? ? return 0;
? ? ? ? }
? ? ? ? send(sockfd, wbuf, strlen(wbuf), MSG_NOSIGNAL);
? ? ? ? memset(wbuf, 0, 100);
? ? ? ? usleep(20);
? ? }
? ? close(sockfd);
? ? return 0;
}
4.2? 服務(wù)器主函數(shù)代碼
int main(int argc, char* argv[])
{
? ? //創(chuàng)建套接字文件,返回套接字文件描述符 socket()
? ? pthread_mutex_init(&mm, NULL);
? ? pthread_t CON;
? ? pthread_create(&CON, NULL, user_connect, NULL); //分配連接的線程
? ? sleep(30); //30s等待連接
? ? while (count != user);
? ? printf("-------**********************************-------\n");
? ? printf("-------WELCOME JOIN DADONG TALK ROOM AGAIN-------\n");
? ? //關(guān)閉文件描述符 close()
? ? close(sockfd);
? ? return 0;
}
主頁資源有全部源碼供各位大佬下載參考,希望能得到大佬的改進(jìn)意見,會持續(xù)完善該項目。