《電子技術應用》
您所在的位置:首頁 > 通信與網(wǎng)絡 > 設計應用 > 利用socket實現(xiàn)Windows與Linux平臺間的網(wǎng)絡通信
利用socket實現(xiàn)Windows與Linux平臺間的網(wǎng)絡通信
來源:微型機與應用2013年第18期
周西峰,,陸 鵬,,郭前崗
(南京郵電大學 自動化學院,江蘇 南京210023)
摘要: 介紹了socket的工作原理,,構建出一個適用于Windows和Linux操作系統(tǒng)的,、跨平臺的網(wǎng)絡通信程序,,并給出設計原理和開發(fā)步驟。整個系統(tǒng)采用客戶機/服務器(C/S)模型,,在Windows系統(tǒng)中,,socket程序利用Visual C#語言編寫。Linux系統(tǒng)中的socket程序調(diào)用select()函數(shù),,則該套接字自動設置為非阻塞方式,,從而提高了程序的執(zhí)行效率。經(jīng)測試,,通信兩端的進程能夠通過各自的套接字收發(fā)消息,,從而實現(xiàn)了Windows與Linux平臺間的通信,。
Abstract:
Key words :

摘  要: 介紹了socket的工作原理,構建出一個適用于Windows和Linux操作系統(tǒng)的,、跨平臺的網(wǎng)絡通信程序,,并給出設計原理和開發(fā)步驟。整個系統(tǒng)采用客戶機/服務器(C/S)模型,,在Windows系統(tǒng)中,,socket程序利用Visual C#語言編寫。Linux系統(tǒng)中的socket程序調(diào)用select()函數(shù),,則該套接字自動設置為非阻塞方式,,從而提高了程序的執(zhí)行效率。經(jīng)測試,,通信兩端的進程能夠通過各自的套接字收發(fā)消息,,從而實現(xiàn)了Windows與Linux平臺間的通信。
關鍵詞: 套接字,;跨平臺網(wǎng)絡通信,;客戶機/服務器;select()函數(shù)

    在工業(yè)生產(chǎn)中,,人們常把穩(wěn)定性高的Linux系統(tǒng)運用到工業(yè)控制領域,,以此來提高控制系統(tǒng)的性能?;赪indows平臺開發(fā)的軟件使用方便,,因此工程中的應用軟件大多數(shù)是以Windows為平臺開發(fā)的。在一個工業(yè)系統(tǒng)中,,人們需要同時使用Windows和Linux兩種操作系統(tǒng),。為了使兩個不同的操作系統(tǒng)能夠協(xié)同工作并互相傳遞消息,需要在兩者間進行通信,。
    在日常工作中,,Windows作為PC機的操作平臺被廣泛使用,而Linux也以其開放的優(yōu)勢逐漸被用戶采用,。在兩種系統(tǒng)被普遍使用的前提下,,如何實現(xiàn)資源共享就成了一個重要的研究課題,需要實現(xiàn)兩個平臺間的互相通信以達到資源共享的目的,。
    基于以上兩點,,實現(xiàn)Windows與Linux平臺間的網(wǎng)絡通信有著重要的研究意義。本文通過socket(套接字)編程實現(xiàn)兩個系統(tǒng)間的通信,,socket是對應TCP/IP協(xié)議的最典型的應用開發(fā)接口,,它提供了不同主機間進程通信的端點。本文闡述了套接字的編程原理,,并舉例說明如何開發(fā)Linux和Windows系統(tǒng)之間的網(wǎng)絡通信程序,。
1 socket基本原理
1.1 基本socket函數(shù)[1]

    socket通信涉及的基本函數(shù)有:
    (1)創(chuàng)建套接字
    sockfd=socket(domain, type, protocol),;參數(shù)domain指定socket地址簇類型,type為套接字類型,,protocol指明socket請求的協(xié)議,sockfd為套接字返回的文件描述符,。
    (2)綁定套接字與本地地址信息
    bind(sockfd,,(struct sockaddr*)&server_addr,sizeof(struct sockaddr));該函數(shù)將本地主機地址以及端口號與所創(chuàng)建的套接字綁定起來,。
    (3)監(jiān)聽連接
    listen(sockfd,,backlog);此函數(shù)表示服務器愿意接收連接,,backlog指隊列中允許的最大排隊請求的個數(shù),。
    (4)建立連接
    connect(sockfd,(struct sockaddr*) &server_addr,,sizeof(struct sockaddr)),;connect用于建立連接,server_addr是保存著服務器IP地址和端口號的數(shù)據(jù)結構struct sockaddr,。
    (5)接收連接請求
    accept(sockfd,,(struct sockaddr*) &client_addr,sizeof(struct sockaddr)),;用于接收客戶機發(fā)來的連接請求,。
    (6)發(fā)送數(shù)據(jù)
    send(sockfd,msg,,len,,flags);將len字節(jié)的數(shù)據(jù)msg發(fā)送出去,,flags通常為0,。
    (7)接收數(shù)據(jù)
    recv(sockfd,buf,,len,,flags);從套接字緩沖區(qū)buf中讀取len字節(jié)長度的數(shù)據(jù),。
    (8)關閉套接字
    close(sockfd),;用于關閉套接字連接。
1.2 socket通信過程
    套接字編程采用客戶機/服務器(C/S)[2]模式,,連接成功后,,雙方可以進行通信。通信過程如圖1所示,。

2 軟件設計
    為避免使用兩臺計算機的麻煩,,在Windows7系統(tǒng)的PC上安裝虛擬機,,虛擬機的操作系統(tǒng)是Linux。這樣就可以在一臺PC上進行通信測試,,主機為Windows平臺,,虛擬機為Linux平臺。
    整個系統(tǒng)采用客戶機/服務器(C/S)模型,,將Linux平臺作為服務器端,,其IP地址為10.33.17.127,端口號為3352,。將Windows平臺作為客戶機端,,其IP地址為10.33.17.126。
2.1 Linux平臺軟件設計
2.1.1 響應連接

    分別調(diào)用socket(),、bind(),、listen()和accept()來監(jiān)聽客戶機端的連接請求并與之連接。
2.1.2 select函數(shù)[4]的使用
    select可以完成非阻塞操作,,即進程執(zhí)行此函數(shù)時不必等待事件發(fā)生,。它能夠監(jiān)視select返回的文件描述符的變化情況,通過返回值來判斷select函數(shù)的執(zhí)行情況,。
    首先定義一個集合變量fd_set rfds,,分別將標準輸入句柄0和當前連接句柄client_fd加入到集合中。先令maxfd為0,,再比較client_fd與maxfd的大小,,將兩者中較大的值賦給maxfd,即將文件描述符的最大值賦予maxfd,。設置最大等待時間tv.tv_sec=1,,tv.tv_usec=0。
    retval=select(maxfd+1,,&rfds,,NULL,NULL,,&tv),,通過返回值retval判斷文件的讀寫情況。若retval為-1,,則出錯,;若retval為0,則繼續(xù)等待,;若retval為正值,,則文件可讀寫,可以執(zhí)行接下來的發(fā)送和接收消息的操作。
2.1.3 發(fā)送與接收消息
    if(FD_ISSET(0,,&rfds))用來檢查指定文件描述符0是否在該集合rfds中,,若滿足則執(zhí)行發(fā)送操作。fgets(buf,,MAXBUF,,stdin)表示將鍵盤輸入的至多MAXBUF個字符的stdin送到buf中,摁下“Enter”鍵后即可發(fā)送,。
    同理,,對于是否接收消息通過if (FD_ISSET(client_fd,&rfds))來判斷,。
2.1.4 斷開連接
    若要斷開連接,則輸入“quit”,。通過命令if(!strncasecmp(buf,,"quit",4))來判斷輸入的內(nèi)容是否為quit,。連接斷開后,,顯示框顯示“Client has terminated the communication.”。
2.2 Windows平臺軟件設計
    在Windows系統(tǒng)中,,使用C#語言來編寫socket程序,。打開Microsoft Visual Studio 2010,新建一個“Windows窗體應用程序”的項目,。在窗體中添加兩個button控件,,分別為button1(連接)和button2(發(fā)送)。并添加4個textBox控件,,分別為textBox1(消息顯示框),、textBox2(消息輸入框)、textBox3(服務器IP地址輸入框)和textBox4(服務器端口號輸入框),。
2.2.1 請求連接
    新建socket,,Server和nPort分別表示服務器IP地址和端口號,通過命令socket.Connect(ServerIP,,nPort)來連接服務器,。
2.2.2 發(fā)送與接收消息

 


    定義發(fā)送的字符串為Message,將消息輸入框textBox2中的內(nèi)容指定為Message,。通過發(fā)送命令socket.Send(System.Text.Encoding.Default.GetBytes(Message))進行消息發(fā)送,。
    新建一個byte數(shù)組byte[] RecvBuffer,通過socket.Receive(RecvBuffer)將接收到的內(nèi)容存放到RecvBuffer中,。接收成功后,,將接收到的內(nèi)容顯示在消息顯示框中。
3 運行結果與分析
3.1 編譯并執(zhí)行Linux端程序

    gcc server_socket.c-o server_scoket
    ./server_socket 3352 Server
    此時,服務器端程序準備就緒,,等待客戶端請求連接,。
3.2 啟動Windows端的連接
    打開Microsoft Visual Studio 2010軟件,點擊“啟動調(diào)試”鍵后彈出窗體界面,。點擊窗體界面中的“連接”鍵后,,客戶機端能夠成功連接服務器端。
3.3 實現(xiàn)互相通信
    連接成功后,,服務器端和客戶機端可以自由發(fā)送消息,。如圖2所示,Windows系統(tǒng)中,,在窗體界面的“消息輸入框”中輸入消息,,點擊“發(fā)送”后即可發(fā)送。在Linux終端中,,輸入要發(fā)送的消息,,點擊“Enter”鍵后進行發(fā)送。如圖3所示,。

3.4 結果分析
    結果表明,,服務器端和客戶機端在成功連接后能夠進行通信。在Linux系統(tǒng)中,,通信結果在終端顯示,。在Windows系統(tǒng)中,通信結果在窗體界面中顯示,。經(jīng)測試,,兩個平臺間能夠完成無數(shù)次的收發(fā)操作。若要結束通信,,在Linux終端中鍵入“quit”,,即斷開連接。
    本文闡述了Windows與Linux系統(tǒng)的網(wǎng)絡傳輸設計方法,,雙方采用TCP/IP協(xié)議,,運用socket 接口來開發(fā)網(wǎng)絡通信程序。Windows平臺利用C#編寫socket程序,,并通過窗體界面顯示通信過程,。Linux平臺中的socket程序調(diào)用select函數(shù),實現(xiàn)非阻塞操作,。套接字使得連接在通信兩端的進程,,能夠通過各自的套接字收發(fā)消息,從而實現(xiàn)了兩個平臺間的全雙工通信,。目前的通信程序只能傳送字符串,,要真正實現(xiàn)兩個系統(tǒng)之間的資源共享與消息傳遞,還需要它們之間能夠傳送文件、照片及視頻等大數(shù)據(jù)量的信息,,這將是下一階段的研究重點,。
參考文獻
[1] 王遠洋,周淵平,,郭煥麗.Linux下基于socket多線程并發(fā)通信的實現(xiàn)[J].微計算機信息,,2009,25(5-3):70-72.
[2] 盧寧,,李定主,,姚暉.Linux和Windows系統(tǒng)之間網(wǎng)絡通信程序的開發(fā)[J].電腦開發(fā)與應用,2002,,15(3):23-24.
[3] 郭勇.利用Socket開發(fā)客戶/服務器應用[J].廣西師范大學學報(自然科學版),,2000,18(1):24-27.
[4] 陳榮軍,,謝舜道,,譚洪舟,等.一種基于Select函數(shù)的嵌入式網(wǎng)絡通信信息轉(zhuǎn)發(fā)機制設計[J].電腦知識與技術,,2013,9(1):25-28.

此內(nèi)容為AET網(wǎng)站原創(chuàng),,未經(jīng)授權禁止轉(zhuǎn)載,。