陳潔 孟曉景
摘要:為了實(shí)現(xiàn)Linux與Windows跨平臺(tái)通信,及時(shí)共享信息,構(gòu)建了一個(gè)適用于跨平臺(tái)的網(wǎng)絡(luò)聊天室通信程序。先搭建跨平臺(tái)通信環(huán)境,然后使用Socket套接字網(wǎng)絡(luò)編程接口實(shí)現(xiàn)通信。整個(gè)系統(tǒng)采用客戶(hù)機(jī)/服務(wù)器(C/S)模型,Windows客戶(hù)端采用MFC框架編寫(xiě),Linux服務(wù)器和客戶(hù)端均采用C語(yǔ)言實(shí)現(xiàn)。通過(guò)測(cè)試,Linux和Windows的客戶(hù)端可以成功連接到服務(wù)器,從而實(shí)現(xiàn)跨平臺(tái)網(wǎng)絡(luò)聊天功能。
關(guān)鍵詞:Linux;Windows;套接字;客戶(hù)機(jī)/服務(wù)器
DOIDOI:10.11907/rjdk.151230
中圖分類(lèi)號(hào):TP319
文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):16727800(2015)006009403
作者簡(jiǎn)介作者簡(jiǎn)介:陳潔(1990-),女,山東菏澤人, 山東科技大學(xué)信息科學(xué)與工程學(xué)院碩士研究生,研究方向?yàn)橛?jì)算機(jī)網(wǎng)絡(luò)應(yīng)用技術(shù);孟曉景(1962-),男,浙江紹興人, 山東科技大學(xué)信息科學(xué)與工程學(xué)院教授,研究方向?yàn)橛?jì)算機(jī)網(wǎng)絡(luò)。
0 引言
Linux是一個(gè)基于POSIX和UNIX的多任務(wù)、多用戶(hù)、支持多線程的操作系統(tǒng)。Linux在眾多方面表現(xiàn)出強(qiáng)大的優(yōu)勢(shì),通常用在控制領(lǐng)域以提高系統(tǒng)性能。然而,目前使用最多的Windows操作系統(tǒng)圖形界面友好,擁有良好的集成開(kāi)發(fā)環(huán)境,操作簡(jiǎn)單,深受廣大用戶(hù)的喜愛(ài)。兩種操作系統(tǒng)各有千秋,越來(lái)越多場(chǎng)合同時(shí)使用,這就出現(xiàn)了跨平臺(tái)的通信問(wèn)題。對(duì)此,本文通過(guò)Socket套接口來(lái)實(shí)現(xiàn)不同操作系統(tǒng)之間的實(shí)時(shí)聊天,運(yùn)用C/S模式設(shè)計(jì)出Windows與Linux操作系統(tǒng)間可以互相通信的網(wǎng)絡(luò)聊天室,本客戶(hù)端可以顯示其它客戶(hù)端的消息,實(shí)現(xiàn)了信息的及時(shí)共享。
1 Socket編程原理與過(guò)程
1.1 Socket編程原理
Socket[1]作為BSD UNIX的進(jìn)程通信機(jī)制,通常也稱(chēng)作“套接字”,用于描述IP地址和端口,是網(wǎng)絡(luò)通信的基本單元?;赥CP/IP協(xié)議的 Socket 編程是一種典型的會(huì)話(huà)編程方式,它既適用于客戶(hù)/服務(wù)器通信方式,又適用于點(diǎn)對(duì)點(diǎn)通信方式。套接字通過(guò)調(diào)用系統(tǒng)提供的庫(kù)函數(shù)實(shí)現(xiàn)數(shù)據(jù)傳輸,不需要過(guò)多了解底層的一些細(xì)節(jié)。本文采用C/S[2]通信方式編程。通信服務(wù)方式分為面向連接和無(wú)連接,這里使用的是面向連接的流套接字。
1.2 Socket編程過(guò)程
Socket編程過(guò)程分為客戶(hù)端和服務(wù)器端編程,大致通信過(guò)程如圖1所示。
Socket編程過(guò)程首先需要?jiǎng)?chuàng)建套接字socket(),然后服務(wù)器端綁定套接字bind(),即將本地主機(jī)IP地址、端口號(hào)與創(chuàng)建的套接字綁定。綁定完成后進(jìn)入監(jiān)聽(tīng)狀態(tài)listen(),等待客戶(hù)端連接。客戶(hù)端如果發(fā)起連接connect(),服務(wù)器和客戶(hù)端的底層就進(jìn)行三次握手接受連接accept()。連接成功后,雙方就可以收發(fā)數(shù)據(jù)了。在此連接上使用send()函數(shù)發(fā)送數(shù)據(jù),在連接的另一端使用rev()函數(shù)接收數(shù)據(jù),這樣,Socket就連接了兩端的應(yīng)用程序。套接字機(jī)制提供了一系列的系統(tǒng)調(diào)用函數(shù),通過(guò)這些函數(shù)調(diào)用,應(yīng)用程序就可以在掩蓋通信協(xié)議細(xì)節(jié)的情況下實(shí)現(xiàn)網(wǎng)絡(luò)傳輸。
2 通信環(huán)境搭建
本系統(tǒng)是跨平臺(tái)網(wǎng)絡(luò)聊天室,Linux為服務(wù)器端,用于接收客戶(hù)端請(qǐng)求,而客戶(hù)端可以是Windows操作系統(tǒng),也可以是Linux操作系統(tǒng)。為避免使用多個(gè)計(jì)算機(jī)的麻煩,本系統(tǒng)在一臺(tái)計(jì)算機(jī)上安裝虛擬機(jī),虛擬機(jī)為L(zhǎng)inux操作系統(tǒng),另外一個(gè)是Win7操作系統(tǒng),在進(jìn)行編程之前,要先檢驗(yàn)Win7操作系統(tǒng)與Linux操作系統(tǒng)是否可以正常進(jìn)行網(wǎng)絡(luò)通信。把虛擬機(jī)端設(shè)置成橋接連接方式[3],這樣虛擬機(jī)就可以當(dāng)成獨(dú)立機(jī)。主機(jī)IP地址為192.168.131.153 ,虛擬機(jī)地址為192.168.131.152,通過(guò)ping命令檢驗(yàn)互通性。
3 跨平臺(tái)通信設(shè)計(jì)
3.1 Linux平臺(tái)服務(wù)器設(shè)計(jì)
通過(guò)此函數(shù)把消息發(fā)送給每個(gè)連接的客戶(hù)端;服務(wù)端程序父子進(jìn)程分別負(fù)責(zé)發(fā)送和接收數(shù)據(jù),以避免數(shù)據(jù)沖撞;本程序服務(wù)端端口號(hào)設(shè)定為:3490,端口綁定函數(shù)int bindPort(unsigned short int port) ,此函數(shù)用來(lái)創(chuàng)建socket(AF_INET,SOCK_STREAM,0)流套接字,并綁定到指定的端口,在Linux操作系統(tǒng)下不需要初始化。
當(dāng)有客戶(hù)端請(qǐng)求連接時(shí),accept(sockfd,(struct sockaddr*)&their_addr,&sin_size)用來(lái)接受客戶(hù)端連接。連接成功后,服務(wù)器創(chuàng)建子進(jìn)程,子進(jìn)程ppid = fork()。父進(jìn)程負(fù)責(zé)接收數(shù)據(jù),子進(jìn)程負(fù)責(zé)發(fā)送數(shù)據(jù),把接收到的數(shù)據(jù)轉(zhuǎn)發(fā)給已連接的客戶(hù)端。
3.2 客戶(hù)端設(shè)計(jì)
因?yàn)榇顺绦驗(yàn)榱奶焓?,所以客?hù)端設(shè)計(jì)分為Windows平臺(tái)和Linux平臺(tái)。
3.2.1 Windows平臺(tái)客戶(hù)端設(shè)計(jì)
Windows客戶(hù)端采用MFC框架來(lái)編寫(xiě)socket程序[4]。打開(kāi)Visual C++6.0新建MFC應(yīng)用程序,添加兩個(gè)窗體,分別為登陸窗口和聊天室窗口。在登陸窗體中添加3個(gè)textBox控件,分別為textBox1(昵稱(chēng)輸入框)、textBox2(服務(wù)器IP輸入框)、textBox1(服務(wù)器端口號(hào)輸入框),并添加兩個(gè)button控件,分別為button1(登陸)、button2(退出)。在聊天室窗體中添加兩個(gè)textBox控件,分別為textBox1(消息顯示框)、textBox2(消息輸入框),并添加兩個(gè)button控件,分別為button1(發(fā)送)、button2(退出)。
請(qǐng)求連接:新建socket、ServerIP和Port分別表示服務(wù)器IP地址和端口號(hào),通過(guò)函數(shù)Connect(ServerIP,Port)連接到Linux服務(wù)器端,成功以后即可收發(fā)數(shù)據(jù)。
發(fā)送與接收消息:定義發(fā)送的字符串為Message,將消息輸入框textBox1中的內(nèi)容指定為Message,通過(guò)send()函數(shù)進(jìn)行消息發(fā)送。新建一個(gè)byte數(shù)組byte[] RecvBuffer,通過(guò)Recv(RecvBuffer)函數(shù)將接收到的消息存放到RecvBuffer中,接收成功后,將內(nèi)容顯示到顯示框。
3.2.2 Linux平臺(tái)客戶(hù)端設(shè)計(jì)
Linux平臺(tái)客戶(hù)端使用C語(yǔ)言編寫(xiě)。首先創(chuàng)建客戶(hù)端套接字clientfd = socket(AF_INET,SOCK_STREAM,0),第二個(gè)參數(shù)表明為流式套接字,即面向連接;然后請(qǐng)求連接服務(wù)器端,通過(guò)connect(clientfd,(struct sockaddr *)&clientaddr,sizeof(struct sockaddr))這個(gè)函數(shù)請(qǐng)求。連接成功后,創(chuàng)建子進(jìn)程pid = fork(),父進(jìn)程用于發(fā)送信息,子進(jìn)程用于接收信息。
4 運(yùn)行結(jié)果分析
4.1 啟動(dòng)Linux服務(wù)器端
4.2 啟動(dòng)Windows客戶(hù)端
打開(kāi)Visual C++編譯、連接成功后,出現(xiàn)登錄窗體,輸入姓名、服務(wù)器IP地址和端口號(hào),點(diǎn)擊連接,和Linux端進(jìn)行連接。此時(shí)用兩個(gè)客戶(hù)端進(jìn)行測(cè)試。和服務(wù)器端連接成功后,Windows客戶(hù)端和Linux客戶(hù)端可以組建一個(gè)聊天室收發(fā)消息。以Windows其中的一個(gè)客戶(hù)端為例,在消息輸入框中輸入消息,點(diǎn)擊發(fā)送,Linux服務(wù)器端接收到消息,然后轉(zhuǎn)發(fā)給其它客戶(hù)端,3個(gè)客戶(hù)端分別發(fā)送完消息后,Windows其中一個(gè)客戶(hù)端顯示內(nèi)容如圖3所示。
4.3 啟動(dòng)Linux客戶(hù)端
在Linux系統(tǒng)下執(zhí)行完上述命令后,客戶(hù)端就和服務(wù)器連接了, Linux客戶(hù)端可以一邊發(fā)送
消息,一邊接收服務(wù)器發(fā)來(lái)的消息,Linux客戶(hù)端顯示如圖4所示。
5 結(jié)語(yǔ)
本文研究了Linux與Windows之間的通信問(wèn)題。雙方采用TCP/IP協(xié)議,運(yùn)用socket接口來(lái)開(kāi)發(fā)網(wǎng)絡(luò)通信程序。本程序?qū)崿F(xiàn)了網(wǎng)絡(luò)聊天室功能,服務(wù)器能向不同的客戶(hù)端同時(shí)轉(zhuǎn)發(fā)另一個(gè)客戶(hù)端發(fā)來(lái)的消息,不同用戶(hù)可對(duì)消息及時(shí)共享。經(jīng)過(guò)測(cè)試,本程序達(dá)到預(yù)期效果。
參考文獻(xiàn):
[1] 李峰.利用流式Socket編程實(shí)現(xiàn)Windows與Linux的通信[J].微計(jì)算機(jī)信息,2006(1):112118.
[2] 郭勇.利用Socket開(kāi)發(fā)客戶(hù)/服務(wù)器應(yīng)用[J].廣西師范大學(xué):自然科學(xué)版,2000,18(1):2426.
[3] 周西峰,陸鵬,郭前崗. 利用流Socket實(shí)現(xiàn)Windows與Linux平臺(tái)間的網(wǎng)絡(luò)通信[J].微型機(jī)與應(yīng)用,2013,32(18):4952.
[4] 多納霍,卡爾福特.TCP/IP socket編程[M].陳宗斌,譯.北京:清華大學(xué)出版社,2009.
責(zé)任編輯(責(zé)任編輯:杜能鋼)
英文摘要Abstract:In order to achieve the crossplatform communication of Linux and Windows, and make information sharing timely,the article build a communication program of internet chatroom for crossplatform.First,it build environment of crossplatform communication , and then use network programming interface of socket.The whole system adopts a Client/Server(C/S) model, using MFC framework to write Windows client, Linux, including server and client, use C language to realize.It is tested that client of Linux and Windows can successfully connect to the server.Then it can realize the function of the crossplatform internet chatroom.
英文關(guān)鍵詞Key Words: Linux;Windows;Socket;C/S