1. socket介面網路編程
面向無連接的端對端通信
//#include <winsock2.h>
//#pragma comment(lib,"WS2_32.lib")
WSADATA wsd;
SOCKET s;
char buf[1024];
if(WSAStartup(MAKEWORD(2,2),&wsd)!=0)
{
return -1;//失敗
}
s=socket(AF_INET,SOCK_DGRAM,0);
if(s==INVALID_SOCKET)
{
WSACleanup();
return -1;//創建套接字失敗
}
SOCKADDR_IN servAddr;
servAddr.sin_family=AF_INET;
servAddr.sin_addr.s_addr=inet_addr(%%1);
servAddr.sin_port=htons(INADDR_ANY);
if(bind(s,(SOCKADDR*)&servAddr,sizeof(SOCKADDR_IN))==SOCKET_ERROR)
{
closesocket(s);
WSACleanup();
return -1;//綁定套接字失敗
}
int nServAddrlen=sizeof(servAddr);
ZeroMemory(buf,sizeof(buf));
if(recvfrom(s,buf,size(buf),0,(SOCKADDR*)&servAddr,nServAddrlen)==SOCKET_ERROR)
{
closesocket(s);
WSACleanup();
return -1;//接收數據失敗
}
CString %%2(buf);
ZeroMemory(buf,sizeof(buf));
strcpy(buf,%%3);
SOCKADDR_IN clientAddr;
clientAddr.sin_family=AF_INET;
clientAddr.sin_addr.s_addr=inet_addr(%%4);
clientAddr.sin_port=htons((short)%%5);
int nClientlen=size(clientAddr);
if(sendto(s,buf,sizeof(buf),0,(SOCKADDR*)&clientAddr,nClientlen)==SOCKET_ERROR)
{
closesocket(s);
WSACleanup();
return -1;//向伺服器發送數據失敗
}
closesocket(s);
WSACleanup();
2. 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下網路編程介面。
(2)winsocket網路編程擴展閱讀:
Windows Sockets模型中,把所有比較靠下面的層次稱為網路系統,把靠上面的層次稱為WinSock應用程序,而WinSock的應用編程介面(API)位於兩者之間。
動態鏈接庫(DLL)是windows的重要特性,動態鏈接庫是帶有定義明確的介面的可執行過程的庫,就像其名稱所提示的那樣,應用程序是在運行時動態鏈接這些庫的,而不是在編譯時靜態鏈接。
3. 怎樣學習Windows 網路編程
新手必學:windows網路編程經典入門
作者:huyoo
對於一個windows網路編程初學者,下面方法是經典入門。
初學者建議不要用MFC提供的類,而用windows API做一個簡單伺服器和客戶端,這樣有助於對socket編程機制的理解。
為了簡單起見,應用程序是基於MFC的標准對話框。
Winsock用WINDOWS API實現:
(1)伺服器端有兩個線程:
主線程 — 你需要編寫以下函數來實現
#define NETWORK_EVENT USER_MESSAGE+100 file://定義網路事件
sockaddr_in clientaddr; file://暫時存放客戶端IP地址
file://自己定義消息映射函數,將上面定義的網路事件映射到處理函數
file://OnNetEvent為網路事件處理函數,它在下面定義
ON_MESSAGE(NETWORK_EVENT, OnNetEvent);
在你對話框中的初始化函數中調用下面的初始化網路的子函數
BOOL InitNetwork() file://初始化網路
{
file://初始化TCP協議
BOOL ret = WSAStartup(MAKEWORD(2,2), &wsaData);
if(ret != 0)
{
MessageBox("初始化套接字失敗!");
return FALSE;
}
file://創建伺服器端套接字
SOCKET serverSocket
= socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(serverSocket == INVALID_SOCKET)
{
MessageBox("創建套接字失敗!");
closesocket(m_Socket);
WSACleanup();
return FALSE;
}
file://綁定到本地一個埠上
sockaddr_in localaddr;
localaddr.sin_family = AF_INET;
localaddr.sin_port = htons(1688);
localaddr.sin_addr.s_addr = 0;
if(bind(serverSocket ,(const struct sockaddr*)&localaddr,
sizeof(sockaddr)) == SOCKET_ERROR)
{
MessageBox("綁定地址失敗!");
closesocket(m_Socket);
WSACleanup();
return FALSE;
}
file://注冊網路非同步事件,m_hWnd為應用程序的主對話框或主窗口的句柄
WSAAsyncSelect(serverSocket, m_hWnd, NETWORK_EVENT,
FD_ACCEPT | FD_CLOSE | FD_READ | FD_WRITE);
listen(serverSocket, 5); file://設置偵聽模式
return TRUE;
}
file://定義網路事件的響應函數
void OnNetEvent(WPARAM wParam, LPARAM lParam)
{
file://調用API函數,得到網路事件類型
int iEvent = WSAGETSELECTEVENT(lParam);
file://得到發出此事件的客戶端套接字
SOCKET pSock = (SOCKET)wParam;
switch(iEvent)
{
case FD_ACCEPT: file://客戶端連接請求
{
OnAccept();
break;
}
case FD_CLOSE: file://客戶端斷開事件:
{
OnClose(pSock);
break;
}
case FD_READ: file://網路數據包到達事件
{
OnReceive(pSock);
break;
}
case FD_WRITE: file://發送網路數據事件
{
OnSend(pSock);
break;
}
default: break;
}
}
void OnAccept(SOCET pSock) file://響應客戶端連接請求函數
{
int len = sizeof(sockaddr);
file://調用API函數,接受連接,並返回一個新套接字
file://還可以獲得客戶端的IP地址
SOCKET clientSocket = accept(serverSocket,
(struct sockaddr*)&clientaddr, &len);
file://為新的socket注冊非同步事件,注意沒有Accept事件
if(WSAAsyncSelect(clientSocket ,m_hWnd, IP_EVENT,
FD_CLOSE | FD_READ | FD_WRITE) == SOCKET_ERROR)
{
MessageBox("注冊非同步事件失敗!");
return;
}
file://自編函數,將此客戶端的相關信息保存下來:套接字、
// IP地址、登陸時間
saveClientSocket(clientSocket,clientAddr,currentTimer);
}
void OnClose(SOCET pSock)
{
file://自編函數,結束與相應的客戶端的通信,釋放相應資源並做相應處理
endClientSocket(pSock);
}
void OnSend(SOCET pSock)
{
file://自編函數,在給客戶端發數據時做一些預處理
handleOnSend(pSock);
}
void OnReceive(SOCET pSock)
{
recv(...); file://調用API函數,讀出網路緩沖區中的數據包
file://自編函數,將此數據包和發出此數據的客戶端
file://clientSocket封裝成一條網路消息
buildNetMsg(...);
file://自編函數,將此網路消息放入一個消息隊列中,由工作線程去處理
saveNetMsg(...);
SetEvent(...); file://用事件對象觸發工作線程
}
客戶端登陸後,隨即把自己的計算機名發給伺服器,伺服器接到後,把它保存下來。這樣伺服器就可以顯示所有在線客戶端的信息了,包括:客戶端計算機名、IP地址、登陸時間等。
注意: 客戶端沒有OnAccept()函數,但有OnConnect()函數。
工作線程 —
在你的應用程序初始化時,創建並啟動一個工作線程
AfxBeginThread(WorkThread,this,THREAD_PRIORITY_NORMAL);
file://this可能為應用程序的主對話框或主窗口的句柄
UINT WorkThread(LPVOID pParam)
{
while(1)
{
file://等待多重事件到來
int ret = WaitForMultipleObject(...);
switch(ret)
{
case OBJECT_0:
{
if(bNewNetMsg) file://查看網路消息隊列是否有新的網路消息
{
readNetMsg(...); file://如有新的網路消息,則讀出
handleNetMsg(...); file://處理此網路消息
}
break;
}
case OBJECT_0 + 1:
{
file://做退出處理
break;
}
default: break;
}
return 0;
}
客戶端為單線程,登陸伺服器時,用connect()函數給伺服器發連接請求;
客戶端沒有OnAccept()函數,但有OnConnect()函數。
在OnConnect()函數里做發連接請求時的預處理;
在OnReceive()函數里響應並處理網路數據;
在OnClose()函數里響應伺服器的關閉事件;
在OnSend()函數里做發數據時的預處理;
如果你還想實現各客戶端之間的在線交流(即所謂的聊天室),你在客戶端還可以基於UDP協議
再做一套多點對多點的區域網組播模型模型,以後在和你聊,你先把上面的程序實現。
以上的I/O非同步模型基於Windows的消息機制,另外還可以用事件模型、重疊模型或完成埠模型,
建議你參考Windows網路編程指南之類的書。
如果你能對上面的機制很熟練,你肯定已經對Winsock編網路程序的機制有一定理解,接下來你可以進行更精彩的編程, 不僅可以在網上傳輸普通數據,而且還
以傳輸語音、視頻數據,你還可以自己做一個聊天室,和你的同學在實驗室的區域網里可以共同分享你的成果。
4. 在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
(4)winsocket網路編程擴展閱讀
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);比起載入,卸載的函數真是輕松愉快。
5. 網路編程和協議問題,答得好再追300分啊!騙人我死!
UDP僅僅是幫助你把客戶端和服務端之間需要通信的內容盡可能的傳輸到對方。而這通信內容隨便你怎麼設定,你可以設定為一個字元串,或者設定為遵循一定協議的數據。
就你上面提的問題「你要涉及協議」,那麼需要做的工作就是通信前按照協議封裝協議,通信後解析協議。
6. windows socket initialize failed是什麼意思
意思就是:Windows操作系統下的網路編程介面初始化失敗。
此類情況需要重裝系統
建議你用」電腦店超級U盤啟動盤製作工具V6.2(UEFI啟動體驗版)「製作U盤啟動盤或者光碟啟動盤進行操作系統的安裝。這個軟體還專門解決UEFI引導失敗的問題,為了順利安裝系統,不會中途卡機和當機,,你必須先把你的所要安裝系統的分區進行格式化,再安裝系統。如果硬碟內有一兩個系統恢復和保護性分區,它會阻止安裝非本機OEM的系統;或者有前一次安裝系統形成的引導分區,在安裝系統過程中,都有可能導致安裝失敗,解決方法:就是徹底刪除這些系統分區,並刪除所有恢復性或保護性的小分區(一般大小為100--500M),再安裝系統。
系統安裝前,首先要下載一個操作系統鏡像文件
可以在下面下載Windows各版本的操作系統,裡面還有詳細的電腦系統安裝教程,可安裝時參考
ghost系統基地 www.ghost008.com 這是目前最好的,最全的。資源最豐富,最安全的操作系統下載網站,下載你所需系統鏡像文件(一般格式為:ISO)。
系統安裝方法1:
最簡單的系統安裝方法:通過DVD光碟機直接安裝:
用」電腦店超級U盤啟動盤製作工具V6.1(UEFI啟動體驗版)「製作DVD系統安裝盤,方法:安裝好此軟體,打開並運行,在顯示的主功能界面上:
首先,選擇並點擊「ISO模式-支持UEFI啟動」;其次,選擇並點擊:「瀏覽「或者」打開文件夾「,尋找並確認你想刻錄(燒制)ISO文件;最後,點擊」刻錄光碟「,即可刻錄(燒制)出你想要的系統安裝盤。
另外也可以用「藍宇電腦維護盤」(或者叫:「追夢人專業電腦維護盤超強版」)把鏡像文件刻錄(燒制)到DVD光碟,做成系統盤。方法:先運行:「藍宇電腦維護盤」,進入:「追夢人專業電腦維護盤PE工具箱」,點擊:」光碟優盤「選項,使用:」光碟映像工具UltraIOS「或者」深山紅葉刻錄軟體「 進行刻錄(燒制)。
(註:」電腦店超級U盤啟動盤製作工具V6.1(UEFI啟動體驗版)「和「藍宇電腦維護盤」去網路搜索一搜既可以搜到)
系統安裝盤做好後,開啟需要安裝系統的電腦,先設定第一順位啟動設備為CD/DVD(光碟或者光碟機)啟動(設置U盤啟動也可以按照下面兩種方式,只要是把DVD項改為USB或者U盤即可);
把光碟機(CD/DVD光碟)設置為第一啟動順位設備的方法1:
開啟電腦,根據開機的時候,剛一閃過的第一次開機畫面,在屏幕下方顯示的白色提示文字,一般是出現「DEL」,那麼按下 「del(delete)」鍵;如果是別的,根據提示可以嘗試按F2、F8、F10、F12等等,就可以進入BIOS 。因為各種型號的電腦根據主板的不同,BIOS設置也略有不同,你先在裡面菜單里找到「BOOT」這一大項,然後進入細項,選擇裡面的,First Boot這個的意思就是電腦啟動的第一引導驅動,就在這里選擇(用上下箭頭,或者屏幕下方有英文提示)CD-ROM/DVD-ROM.然後按F10保存後重新啟動,當光碟機里有可以支持的啟動光碟時,會在屏幕上方顯示:「start booting from cd」或者「start booting from dvd」等字樣,此時立刻點回車鍵(Enter鍵)電腦就會先從光碟引導進入了。(特註:設定U盤為第一順位啟動設備的方法同上)
把光碟機(CD/DVD光碟)設置為第一啟動順位設備的方法2:
開啟電腦,根據開機第一個啟動畫面,在電腦最下方的顯示的提示,不停地F9(也可能是F2或者F12),可進入快速啟動設備選擇項菜單,在菜單里選擇:CD-ROM/DVD-ROM(「光碟啟動」、「光碟機啟動」)也可進入光碟引導(進入步驟同方法1)(特註:設定U盤為第一順位啟動設備的方法同上)。
然後等待光碟機運行,進入DVD光碟機載入頁面後(屏幕上會顯示:「start booting from cd」或者「start booting from dvd」等字樣),此時立刻點回車鍵(Enter鍵),即可進入系統安裝。(安裝過程基本是傻瓜式的,按提示步驟一步步執行即可,很簡單,亦不在此贅述。)
系統安裝方法2:
最流行的的系統安裝方法:用U盤做成系統啟動安裝盤
具體方法:
准備好一個等於或者大於4GB的U盤,先完成格式化。
a、從電腦店U盤工具官方網站u.diannaodian.com (前面加:http://)-下載」電腦店超級U盤啟動盤製作工具V6.1(UEFI啟動體驗版)「。
b、運行程序之前請盡量關閉殺毒軟體和安全類軟體(本軟體涉及對可移動磁碟的讀寫操作,部分殺軟的誤報可能會導致製作失敗!)下載完成之後Windows XP系統下直接雙擊運行即可,Windows Vista或Windows7/8系統請點右鍵以管理員身份運行。
U盤啟動安裝盤的具體製作:
1. 默認模式:
默認模式1.1:打開主程序,插入U盤/SD卡等可移動設備,在磁碟列表裡會自動列出當前電腦中所有的可移動磁碟的盤符、型號、容量等信息。
默認模式1.2:選擇你要製作啟動的可移動磁碟,啟動模式USB-HDD或USB-ZIP可選,默認採用USB-HDD模式。(chs模式主要針對某些不能檢測的Bios,一般不需要勾選此項!如果你想把U盤剩餘部分轉成NTFS格式可以勾選NTFS選項,注意:格式化成NTFS會影響U盤啟動部分功能的使用,除非需要存儲超過4G的單文件,否則不建議勾選此項!)
默認模式1.3:盡量退出殺毒軟體和安全類軟體以免製作失敗,點擊「一鍵製作啟動U盤」按鈕,程序會提示是否繼續,確認所選U盤無重要數據後點是開始製作.
(注意:使用電腦店U盤啟動盤製作工具2.0以及之前版本製作過的U盤如果製作失敗請先執行初始化U盤)
默認模式1.4:製作過程根據電腦配置和U盤晶元的不同耗時長短也不同,請耐心等待。製作完成後正確設置電腦BIOS即可從U盤啟動了。為了驗證U盤啟動製作是否成功,可以運行模擬啟動。
註:模擬啟動僅供測試U盤啟動是否製作成功,不可用於測試內部DOS和PE系統。
2. ISO模式:
ISO模式2.1:切換到ISO模式或者直接點擊主程序左上角的ISO製作,程序會切換到ISO製作界面。
ISO模式2.2:點擊「一鍵製作啟動U盤」按鈕後程序會在「D:\電腦店ISO\」文件夾下創建DND.ISO鏡像。
ISO模式2.3:打開ISO模式的一鍵製作啟動U盤,點擊ISO模式里的按鈕,按照圖中推薦選項進行選擇,最後點擊寫入按鈕等待寫入完成。(如需刻錄光碟,點擊「刻錄光碟」按鈕進行刻錄操作!)
註:ISO模式同樣支持將Win7或者Win8系統鏡像寫入U盤做成系統安裝盤。
按以上步驟製作好U盤的系統安裝盤,即可安裝Win7或者Win8系統了。
小註:
把U盤設置為第一啟動順位設備的方法1:
開啟電腦,根據開機的時候,剛一閃過的第一次開機畫面,在屏幕下方顯示的白色提示文字,一般是出現「DEL」,那麼按下 「del(delete)」鍵;如果是別的,根據提示可以嘗試按F2、F8、F10、F12等等,就可以進入BIOS 。因為各種型號的電腦根據主板的不同,BIOS設置也略有不同,你先在裡面菜單里找到帶有「BOOT」字樣的這一大項,然後進入細項,選擇裡面的,First Boot:這個的意思就是電腦啟動的第一引導驅動,就在這里選擇(用上下箭頭,或者屏幕下方有英文提示)」USB「字樣的設備,然後按F10保存後重新啟動,當電腦重啟後,里有可以支持的U盤啟動盤時,會在屏幕上面顯示進入U盤的系統安裝界面。
把U盤設置為第一啟動順位設備的方法2:
開啟電腦,根據開機第一個啟動畫面,在電腦最下方的顯示的提示,不停地F9(也可能是F2或者F12),可進入快速啟動設備選擇項菜單,在菜單里選擇:」USB「字樣的設備,也可進入U盤啟動引導。(進入步驟同方法1)
通過U盤安裝系統的過程基本是傻瓜式的,按照系統安裝界面的提示步驟一步步執行即可,很簡單,亦不在此贅述。)
如有疑問,請追問,必復!
如滿意,請給我一個採納,謝謝!