windows網路編程技術
『壹』 在windows下,如何用純c語言實現socket網路編程
mfc只是對socket進行了一些封裝,大部分人做網路編程都是用的原始的socket,比如如下介面都可以在c下進行調用
1.socket()
2.bind()
3.connect()
4.listen()
5.accept()
6.send() 和recv()
7.sendto() 和recvfrom()
8.close() 和shutdown()
9.getpeername()
10.gethostname()
這些介面是在Winsock2.h中定義的不是在mfc中定義的,你只需要包含Winsock2.h頭文件和Ws2_32.lib庫就可以了。
『貳』 windows網路編程合適嗎
合適。這個前景非常的大,很多網路編程技術人員他們的工資都非常的高。而且待遇也挺好的。
『叄』 在windows下用C語言如何實現socket網路編程,需要用到哪些頭文件或者庫
需要用到的頭文件包含:
#include <winsock2.h>
#include <windows.h>
與Linux環境下socket編程相比,windows環境多了一個步驟:啟動或者初始化winsock庫
Winsock,一種標准API,一種網路編程介面,用於兩個或多個應用程序(或進程)之間通過網路進行數據通信。具有兩個版本:
Winsock 1:
Windows CE平台支持。
頭文件:WinSock.h
庫:wsock32.lib
Winsock 2:
部分平台如Windows CE貌似不支持。通過前綴WSA可以區別於Winsock 1版本。個別函數如WSAStartup、WSACleanup、WSARecvEx、WSAGetLastError都屬於Winsock 1.1規范的函數;
頭文件:WinSock2.h
庫:ws2_32.lib
mswsock.h用於編程擴展,使用時必須鏈接mswsock.dll

(3)windows網路編程技術擴展閱讀
winsock庫的載入與卸載:
載入:int WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData);
載入成功,返回值為0。
WORD wVersionRequested:載入的winsock版本,使用宏MAKEWORD(x, y),x表示高位元組,y表示低位元組。然而使用時MAKEWORD(2, 2)。高位元組與低位元組相同~~
LPWSADATA lpWSAData:WSADATA結構的指針,傳入參數後,系統幫助我們填充版本信息。有興趣的可以看看結構體內容,不過基本用不著。
卸載:int WSACleanup(void);比起載入,卸載的函數真是輕松愉快。
『肆』 請比較Linux與Windows在網路編程方面的特點
找了一段,大致涉及到了您的問題:
一、socket的模式
socket一般有兩種模式:同步和非同步(windows網路編程技術中也可叫鎖定和非鎖定,Linux網路編程叫阻塞和非阻塞)。
二、socket的類型
socket一般有三種類型,基於TCP的流式套接字,基於UDP的數據報套接字和原始套接字。
三、socket的IO模型
socket
的IO模型是編程中使用socket兩種模式的策略,它們適用的場合不同,在不同的操作系統上支持的模型也不同,例如windows從NT版本才開始支持
完成埠模型。Linux和Windows所支持的模型也有區別,當然也有相同的地方,可能叫法不一樣,但大致思路是一樣的,下面分別介紹windows
和Linux的IO模型
1、 Windows下的套接字IO模型:
A、 Select(選擇)模型
用於同步socket的狀態檢測模型,又叫(Linux)多路復用,可以同時檢測多個socket的狀態
B、 WSAAsyncSelect(非同步選擇)模型
用於非同步socket的非同步事件設置,它是基於Windows消息的模型,必須先打開一個窗口,然後把窗口和socket的消息綁定,這樣,在socket有消息通知時,操作系統便通知窗口,然後在窗口進行處理。
C、 WSAEventSelect(非同步事件)模型
用
於非同步socket的非同步事件,它是基於網路事件的模型,先使用CreateEvent創建一個事件,然後使用WSAEventSelect進行事件綁
定,然後可以使用WaitForMultipleObject(Event)進行事件監聽,可以同時監聽多個事件,不光是socket的,比如可以監聽使
用CreateWaitableTimer創建的Timer等。
D、 重疊IO模型
用
於非同步socket,在創建socket時需要在創建函數WSASocket中使用WSA_FLAG_OVERLAPPED標志,然後在投遞IO請求的時
候將一個Overlapped結構體指針賦給投遞函數,可以使用WSAWaitForMultipleObject來監聽事件,然後使用
WSAGetOverlappedResult來獲取IO的狀態,也可以在Overlapped結構體中使用完成常式來處理,即在投遞函數中把完成常式賦
給投遞函數。
E、 完成埠模型
它
是迄今為止最復雜的一種IO模型,當應用程序需要管理眾多的套接字並且希望隨著系統內安裝的CPU數目的增多,應用程序的性能也可以線性增加,就可以使用
這種模型,它的原理是每個CPU可以單獨負責一個線程的執行,避免線程的頻繁切換。使用這種模型往往可以達到最佳的系統性能。
首
先需要使用CreateIOCompletePort來創建完成埠,然後將IO句柄和此埠綁定,綁定也是使用此函數,當然也可以一次完成。接著是創建
工作者線程,工作者線程會使用GetQueuedCompletionStatus進入完成埠維護的線程池,當有完成事件時,會激活一個線程。
2、 Linux下的IO模型
A、阻塞IO
B、非阻塞IO
C、IO多路復用(選擇)
D、信號驅動
用於非同步socket,首先設定信號處理函數,然後使用fcntl函數設定socket的擁有者,像windows下使用WSAAsncSelect設定socket的窗口一樣。使用這種模型,當內核操作可以被操作的時候通知我們的應用程序
E、非同步IO
當內核在所有操作完成後才會通知應用程序
四、socket的一些使用上的優化
A、緩沖區的優化,可以考慮讓應用程序使用比較小的緩沖區,但同時使用多個WSARecv
B、使用socket選項SO_SNDBUF和SO_RCVBUF設置socket緩沖區大小,如果設為0,操作體系統會使用應用程序的緩沖區,這樣避免了從系統緩沖區向用戶區復制的開銷
五、注意這些IO模型有些不光是針對socket的,其他的IO操作也可以使用,最常用使用的是WriteFile,ReadFile等函數。
其它查考網址:
http://blog.163.com/tianle_han/blog/static/6617826200821522743948/
http://blog.csdn.net/yibulianhua/article/details/5374317
『伍』 Winsocket是什麼
Winsocket是windows socket的簡寫,是指Windows下網路編程的規范。
Windows Sockets是Windows下得到廣泛應用的、開放的、支持多種協議的網路編程介面。從1991年的1.0版到1995年的2.0.8版,經過不斷完善並在Intel、Microsoft、Sun、SGI、Informix、Novell等公司的全力支持下,已成為Windows網路編程的事實上的標准。
Windows Sockets規范以U.C. Berkeley大學BSD UNIX中流行的Socket介面為範例定義了一套microsoft Windows下網路編程介面。

(5)windows網路編程技術擴展閱讀:
Windows Sockets模型中,把所有比較靠下面的層次稱為網路系統,把靠上面的層次稱為WinSock應用程序,而WinSock的應用編程介面(API)位於兩者之間。
動態鏈接庫(DLL)是windows的重要特性,動態鏈接庫是帶有定義明確的介面的可執行過程的庫,就像其名稱所提示的那樣,應用程序是在運行時動態鏈接這些庫的,而不是在編譯時靜態鏈接。
『陸』 請給一些Windows中網路編程的資料
為一個不斷進取的編程者,我們常常不滿足於編程語言所提供的一般功能,總是希望能夠實現一些特殊的功能,這有時不但是我們程序的要求,有時也是編程者心理上需要(試想,還會有什麼比在深夜中巧妙解決一個難題而更令人興奮呢?)。VisualBasic,做為一個當前最流行的快速編程環境,就給我們提供了實現這些目標的平台,事實上,它無限擴展的API介面可以實現所有WINDOWS下可以實現的功能。然而對於初學者來說,「浩瀚「的API函數總是顯得那麼神奇與不可琢磨,因此在實際應用過程中不能夠靈活應用。下面我將結合兩個小例子來示範介紹VB中調用API函數的步驟和功能,並總結說明在實際工作中如何提高這方面的技巧。例子在WINDOWS98下採用VB6.0編譯。
一.限制滑鼠的移動
---- 有時我們的軟體要求用戶在未完成某一任務時,滑鼠不能移出當前活動控制項,換句話就是將滑鼠限制在控制項的內部,直到任務完成或用戶中斷為止。這個功能藉助API函數實現起來思路很清楚,代碼也很簡潔。其思路是先確定當前滑鼠的位置;然後確定當前活動控制項的大小;最後將滑鼠限制在活動控制項內。(下面忽略項目建立等過程)
---- 1.建立一個新項目:新窗體為form1,在form1上添加一個commandbutton,設置其Name=CMButton1;Caption=「將滑鼠限制在此按鈕中「
---- 2.拷貝API函數和POINTAPI結構:打開VB6.0自帶的API瀏覽器,調入WIN32API.txt文件,復制以下結構和函數聲明到form1的聲明部分:
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Private Type POINTAPI
x As Long
y As Long
End Type
Private Declare Function ClientToScreen Lib
「user32「 Alias 「ClientToScreen「 (ByVal
hwnd As Long, lpPoint As POINTAPI) As Long
『用來確定當前滑鼠的位置
Private Declare Function ClipCursor Lib
「user32「 Alias 「ClipCursor「 (lpRect As Any)
As Long 『用來限定當前滑鼠的活動范圍
---- 3.定義一個通用過程ConfineTo
Public Sub ConfineTo (myCtl As Object)
On Error Resume Next
Dim tmpRect As RECT
Dim pt As POINTAPI
With myCtl
If TypeOf myCtl Is Screen Then 『鎖定在屏幕范圍內
tmpRect.Left = 0
tmpRect.Top = 0
tmpRect.Right = (.Width \ Screen.TwipsPerPixelX)
tmpRect.Bottom = (.Height \ Screen.TwipsPerPixelY)
Elseif TypeOf myCtl Is form 『鎖定在窗體范圍內
tmpRect.Left = (.Left \ Screen.TwipsPerPixelX)
tmpRect.Top = (.Top \ Screen.TwipsPerPixelY)
tmpRect.Right = (.Left + .Width) \ Screen.TwipsPerPixelX
tmpRect.Bottom = (.Top + .Height) \ Screen.TwipsPerPixelY
else
pt.X = 0
pt.Y = 0
Call ClientToScreen(.hWnd, pt)
『獲取當前控制項在屏幕上的位置
tmpRect.Left = pt.X
『保存當前控制項位置
tmpRect.Top = pt.Y
pt.X = .Width
pt.Y = .Height
Call ClientToScreen(.hWnd, pt)
tmpRect.Bottom = pt.Y
tmpRect.Right = pt.X
End If
Call ClipCursor(tmpRect)
End With
End Sub
---- 4.在 CMButton1_Click()中加入以下代碼
Static Cliped As Boolean
『靜態變數用來控制狀態切換
If Not Cliped Then
ConfineTo Cmbutton1
Cliped = True
Else
ConfineTo Screen 『取消滑鼠限制
Cliped = True
End If
---- 5. 運行後,滑鼠點擊cmbutton1,此時滑鼠只能被鎖定在此按鈕內部,再次點擊按鈕,限製取消。
二.創建臨時文件
---- 臨時文件用來保存軟體運行過程中的臨時變化,這對於熟悉WORD等軟體的人來說,經常會遇到。那麼臨時文件是如何產生的呢,其實很簡單,只需要一個API函數就可以。
---- 1.拷貝聲明函數(方法同前)
Private Declare Function GetTempFileName Lib 「kernel32「 _
Alias 「GetTempFileNameA「 (ByVal lpszPath As String, _
ByVal lpPrefixString As String, ByVal wUnique As Long, _
ByVal lpTempFileName As String) As Long
參數定義如下:
lpszPath =傳入保存臨時文件的路徑 ,如「C:\mytemp「
lpPrefixString=傳入臨時文件名開始的前三個字母,
起到幫助識別臨時文件來源的作用。
wUnique =0 ,windows隨機產生文件名;否則安其值定義文件名。
lpTempFileName=返回隨機文件名
---- 2.返回臨時文件名
Private Function GenTempName(sPath As String)
Dim sPrefix As String
Dim lUnique As Long
Dim sTempFileName As String
If IsEmpty(sPath) Then sPath = 「c:\temp「
sPrefix = 「TVB「
lUnique = 0 『windows隨機給名
sTempFileName = Space$(100)
GetTempFileName sPath, sPrefix, lUnique, sTempFileName
sTempFileName = Mid$(sTempFileName, 1,
InStr(sTempFileName, Chr$(0)) - 1) 『去掉多餘空格
GenTempName = sTempFileName
End Function
---- 3.將下面代碼加入到form1_click()事件中
MsgBox GenTempName(「c:\temp「)
---- 4.運行,滑鼠點擊form,彈出msgbox,顯示生成「c:\temp\TVB724.tmp「文件,用文件管理器查看,在c:\temp下有TVB724.tmp 文件,長度為0K。
---- 需要注意的是,傳入的路徑必須是有效路徑,否則GenTempName函數返回0,lpTempFileName中也沒有臨時文件名。
三.結束語
---- 從上面可以看出,API函數的確簡單高效,但也充滿一些看似高深的變數而使人卻步。我們不禁會問,究竟什麼時候要用到API函數?具體哪些函數可以解決我的問題?,那些函數中的變數都代表什麼?其實對這些問題,即使對一個VB高手也難給出明確的回答,因為API函數庫實在太龐大了,每一個人最終只能熟悉其中的一小部分(這也可能是調用API的文章層出不窮的原因吧)。總結自己的一點經驗,我覺得應該注意以下幾點。
---- 1.熟練掌握VB基本技巧,了解其所能所不能,這是最基本的要求。
---- 2.了解WINDOWS內部控制機理,這樣對一些復雜的問題就可以逐步分析其調用機制,初步確定採用哪部分的API函數來解決問題。
---- 3.案頭必備一本最新的VB版的WINDOWS API 大全,推薦機械工業出版社的< >。書中給出了每一個VB可以調用的API函數的詳細說明,可以幫助精確了解所需要的API函數的變數聲明。
---- 4.多看別人的程序。報紙雜志,尤其是網上這方面的文章數不清。這是最快的方法。
---- 5.隨用隨查。永遠不要在用不到的函數上浪費寶貴的時間
『柒』 如何使用windows網路編程select
1. select系統調用
select系統調用是用來讓我們的程序監視多個文件描述符的狀態變化的。程序會停在select這里等待,直到被監視的文件描述符有某一個或多個發生了狀態改變。
select()的機制中提供一fd_set的數據結構,實際上是一long類型的數組,每一個數組元素都能與一打開的文件句柄建立聯系,建立聯系的工作由程序員完成,當調用select()時,由內核根據IO狀態修改fd_set的內容,由此來通知執行了select()的進程哪些Socket或文件可讀可寫。
select函數原型:
#include <sys/select.h> #include <sys/time.h>#include <sys/types.h>#include <unistd.h>int select(int nfds, fd_set * readfds, fd_set * writefds, fd_set * exceptfds, const struct timeval * timeout);
ndfs:select監視的文件句柄數,視進程中打開的文件數而定,一般設為要監視各文件中的最大文件描述符值加1。
readfds:這個文件描述符集合監視文件集中的任何文件是否有數據可讀,當select函數返回的時候,readfds將清除其中不可讀的文件描述符,只留下可讀的文件描述符。
writefds:這個文件描述符集合監視文件集中的任何文件是否有數據可寫,當select函數返回的時候,writefds將清除其中不可寫的文件描述符,只留下可寫的文件描述符。
exceptfds:這個文件集將監視文件集中的任何文件是否發生錯誤,其實,它可用於其他的用途,例如,監視帶外數據OOB,帶外數據使用MSG_OOB標志發送到套接字上。當select函數返回的時候,exceptfds將清除其中的其他文件描述符,只留下標記有OOB數據的文件描述符。
timeout:本次select()的超時結束時間。這個參數至關重要,它可以使select處於三種狀態:
(1)若將NULL以形參傳入,即不傳入時間結構,就是將select置於阻塞狀態,一定等到監視文件描述符集合中某個文件描述符發生變化為止;
(2)若將時間值設為0秒0毫秒,就變成一個純粹的非阻塞函數,不管文件描述符是否有變化,都立刻返回繼續執行,文件無變化返回0,有變化返回一個正值;
(3)timeout的值大於0,這就是等待的超時時間,即select在timeout時間內阻塞,超時時間之內有事件到來就返回了,否則在超時後不管怎樣一定返回,返回值同上述。
函數的返回值:
正值:表示監視的文件集中有文件描述符符合要求
零值:表示select監視超時
負值:表示發生了錯誤,錯誤值由errno指定。
宏操作:
FD_ZERO(fd_set *set): 用來清除描述片語set的全部位
FD_SET(int fd,fd_set*set): 用來設置描述片語set中相關fd的位
FD_ISSET(int fd,fd_set *set): 用來測試描述片語set中相關fd 的位是否為真
FD_CLR(inr fd,fd_set* set): 用來清除描述片語set中相關fd 的位注意事項:
(1)對於可寫性的檢查,最好放在需要寫數據的時候進行檢查。如果和可讀性放在同一個地方進行檢查,那麼select很可能每次都會因為可寫性檢查成功而返回。
(2)select()調用會清空傳遞給它的集合參數中的內容,也就是會清空readfds、writefd、exceptfds這三個指針參數所指定的描述符集合。因此,在每次調用select()之前,必須重新初始化並把需要監視的描述符填寫到相應的描述符集合中。select()調用也會清空timeout指針所指向的struct timeval結構,所以在每次調用select()之前也要重新填充timeout指針所指向的struct timeval結構。
『捌』 電腦編程入門書籍,應該先看什麼
我轉載的,感覺對你有用!!! 都是我看過或正要看的書,晾晾書架,希望對後來者也有一點作用,當年我也是浪費時間看了一些沒有價值的書籍,頗為後悔,現將精華總結如下:
c語言篇:(雖有人說學C++不用先學c,但我頗不以為然,不知數據為何,又何來的封裝繼承多態)
1:c語言入門大學教程c語言譚浩強版足以。
2:windows c語言API編程基礎,推薦《windows程序設計(第5版)》 Charles Petzold著,通過學習可對界面編程一覽無遺,剩下的就是看怎樣用c++進行包裝,體會c++面向對象復用代碼的威力了。
3:《TCP/IP協議及網路編程技術》 羅軍舟等編著 清華大學出版社 國貨上品,是應用c語言在windows下進行網路編程的好教材.也是使用c++進行網路編程的知識准備。
C++基礎篇: 1:《C++Primer(3or4版)》入門第一部.
2:《深入淺出MFC》 侯捷著 國貨精品,本應歸入學習vc的范疇,但他實際是對widows API的c++框架介紹,用來做vc項目只能起輔助作用,對建立c++面向對象思想卻多有啟迪。
3: 《C++標准程序庫》 侯捷/孟岩譯 庫是語言的延伸,學習c++不可不看。
4: 《C++實踐之路》 周良忠譯 一個計算器例子貫穿全書,幾乎用到C++所有知識,真正的例子驅動教學法。
面向對象技術:
1: 《設計模式-可復用面向對象軟體的基礎》 美國四人幫的跨時代大作 230頁卻足以開啟一個時代,真正體現了面向對象技術的價值,是代碼復用的經典之作,不能不看。
2: 《UML Distilled》 UML建模很火歐,但對我來說看主要目的是看懂類關系草圖,這本小書足以。
c++進階篇
1: 《C++高級編程》 劉鑫等譯 有對c++知識的精要總結其中包括如何更好地實現重用、如何有效地測試和調試等C++專業人員常用的一些技術與方法,值得了解。
2: 《Effective C++》,《必知必會》,《c++編程規范》 三本小書卻足以檢測你對c++知識掌握的真正情況。
c++高階篇:(本人仍在閱讀中)
1: 《深入探索c++對象模型》 侯捷譯 對C++內存布局的深入介紹,是真正理解com/corba等組件技術的必備基礎。
2: 《C++ Templates中文版》 陳偉柱譯 模板聖經,現代c++發展的前沿泛型編程思想總結 (是看懂boost類庫的知識儲備)。
3:《C++設計新思維》 侯捷/於春景譯 泛型編程與設計模式的綜合應用,鍛煉思維的好書,(已經買了半年多了,等我有空時一定看'_')。
其他:
C++編程思想,C++語言之父的c++語言特別版 等書本人只在書店裡見過,沒有閱讀就不敢置評了。
(一)語言入門:
《C++ Primer》
最新版本:第三版(第四版國外已上架,國內一些網上書店也在預訂中)
適合有豐富C經驗,缺乏C++經驗的。不過我個人一直認為此書帶著過於強烈的C語言的痕跡,對於C++的學習未必是好事。
《The C++ Programming Language》/《C++程序設計語言》
最新版本:第三版特別版
簡稱TC++PL,有其他語言的豐富經驗的。(也有人簡稱之為「TCPL」,但需與另一本《The C Programmer Language》區分開來)
《Essential C++》
《Accelerated C++》
這兩本薄一些,都是不錯的選擇。《Accelerated C++》本人沒有讀過,從各方面的評價來看,完全值得推薦。
以上幾本書都有相應的中文版,而且翻譯的質量都不錯。上面的書未必都需要讀一遍,但無論如何,TC++PL是應該閱讀的。
(二)進階A:
這個路線側重於語言本身
《Effective C++》
最新版本:第二版(第三版國外已上架,國內一些網上書店也在預訂中)
簡稱EC。C++程序員必讀!很多時候,我們說C++聖經不是指TC++PL,而是這一本。《The Pragmatic Programmer》一書中寫到:「一旦你發現自己要參與C++項目的開發,趕快跑(不要走)到書店去購買Scott Mayer的《Effective C++》,可能還要《More Effective C++》」。
《C++ Coding Standards: 101 Rules, Guidelines, and Best Practices》/《C++ 編程規范》
個人認為此書應為C++程序員必備的案頭書。幾乎Effective系列和Exceptional系列都在這里得到了總結。最新的模版、異常的業界經驗都在這里的到了體現。可能的唯一缺陷就是對一個新手而言,關於「為什麼這么做」的問題,解釋的不夠。
我的看法是:如果你不理解其中的條款,記憶,並且照做;如果你理解其中的條款,我猜你一定會同意書中的觀點。我認為這本書中的內容至少在2009年以前都不會過時,人們將廣為傳誦它制定的101條戒律。
還不知道他的簡稱,也許「101」會成為一個候選者?
提到《Effective C++》,那麼另外三本書一一浮出水面:
《More Effective C++》
《Exceptional C++》
《More Exceptional C++》。
新書《Exceptional C++ Style》也是值得一看的好書。
上述幾本書,一本也不應該放過。
個人建議上述書籍按順序閱讀。並且,在將來反復閱讀這幾本書。
『玖』 windows網路編程和.net有關系么
windows 網路編程是指在 WINDOWS 這個平台下進行網路相關的編程工作
WINDOWS 本身提供了很多 API 來進行網路編程
在 .NET 是一個框架,這個框架里包含了很多的語言,而這個框架對 WINDOWS 的 API 進行了相應的封裝,並在此基礎上進了功能的添加或優化,使用起來就比較方便,沒有直接使用 WIN API 那麼復雜
