本人小白菜逼一枚,,,,剛建立博客,也寫不了太深入的,就寫點上課的筆記什麼的。有錯誤希望廣大博友指出,我一定虛心學習接收改正。我的新浪郵箱:[email protected]我的QQ郵箱:[email protected]電腦網路部分今天主講的tcp和udp協議,這兩協議都是數據鏈路層下...
本人小白菜逼一枚,,,,剛建立博客,也寫不了太深入的,就寫點上課的筆記什麼的。有錯誤希望廣大博友指出,我一定虛心學習接收改正。
我的新浪郵箱:[email protected]
我的QQ郵箱:[email protected]
電腦網路部分今天主講的tcp和udp協議,這兩協議都是數據鏈路層下的重要協議,說其重要原因是因為在數據間傳送時
TCP安全可靠,不丟包,面向連接,三次握手,四次揮手,效率低;
UDP數據傳輸速度快,面向無連接類型;
其次講了埠號:埠號分三類,第一類,知名埠:是被註冊的埠柏闊http80埠,範圍是0~1023;
什麼是http80埠:80埠是為HTTP(HyperText Transport Protocol)即超文本傳輸協議開放的,此為上網衝浪使用次數最多的協議,主要用於WWW(World Wide Web)即萬維網傳輸信息的協議。可以通過HTTP地址(即常說的“網址”)加“:80”來訪問網站,因為瀏覽網頁服務預設的埠號都是80,因此只需輸入網址即可,不用輸入“:80”了。
第二類,動態埠:供本機使用的埠越好,即系統隨機分配,範圍是1024~5000
第三類,保留埠:為伺服器保留的專有埠號。 範圍是 5000~65535
還有Listen:
載波監聽多點接入/碰撞檢測
CSMA/CD 表示 Carrier Sense Multiple Access with Collision Detection。
“多點接入”表示許多電腦以多點接入的方式連接在一根匯流排上。
“載波監聽”是指每一個站在發送數據之前先要檢測一下匯流排上是否有其他電腦在發送數據,如果有,則暫時不要發送數據,以免發生碰撞。
匯流排上並沒有什麼“載波”。因此, “載波監聽”就是用電子技術檢測匯流排上有沒有其他電腦發送的數據信號。
碰撞檢測”就是電腦邊發送數據邊檢測通道上的信號電壓大小。當幾個站同時在匯流排上發送數據時,匯流排上的信號電壓擺動值將會增大(互相疊加)。當一個站檢測到的信號電壓擺動值超過一定的門限值時,就認為匯流排上至少有兩個站同時在發送數據,表明產生了碰撞。所謂“碰撞”就是發生了衝突。因此“碰撞檢測”也稱為“衝突檢測”
每一個正在發送數據的站,一旦發現匯流排上出現了碰撞,就要立即停止發送,免得繼續浪費網路資源,然後等待一段隨機時間後再次發送。
改變Socket屬性:
屬性分為 阻 塞:預設狀態下是阻塞狀態
非阻塞:u_long mode = 1;ioetlsocket(socket的名字,FIONBIO,地址&mode);
函數原型 int ioctlsocket( _In_ SOCKET s, _In_ long cmd, _Inout_ u_long *argp );
cout<<"------------------------------------------------------------------------------------------"<<endl;
重點來了:針對本階段的學習方向,在家中和在教室使用的ip不同,每次應該記得更換ip地址
使用TCP通信和UDP通信 的實現過程不同,作為初學者應該仔細斟酌,
之後會對兩種通信方式的差異進行詳細的分析和區別,進行理解。
cout<<"------------------------------------------------------------------------------------------"<<endl;
服務端就是接收端
服務端的代碼
#include <iostream>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <windows.h>
#include <fstream>
using namespace std;
#pragma comment(lib, "ws2_32.lib")
class FileInfo
{
public:
void SetFileName(char *szname)
{
strcpy_s(m_szfilename,MAX_PATH,szname);
}
char *GetFileName()
{
return m_szfilename;
}
void SetFileSize(DWORD dwfilesize)
{
m_dwfilesize = dwfilesize;
}
DWORD GetFileSize()
{
return m_dwfilesize;
}
private:
char m_szfilename[MAX_PATH];
DWORD m_dwfilesize;
};
int main()
{
//1,載入庫;
WORD wVersionRequested;
WSADATA wsaData;
int err;
SOCKET socketserver ;
SOCKET socketwaiter ;
try
{
wVersionRequested = MAKEWORD(2, 2);
err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0) {
throw err;
}
if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2) {
throw 2;
}
else
printf("The Winsock 2.2 dll was found okay\n");
//2,創建套接字
socketserver = socket(AF_INET,SOCK_STREAM ,IPPROTO_TCP );
if (socketserver == INVALID_SOCKET )
{
throw "Create Failed";
}
//3,綁定
sockaddr_in sockaddrserver;
sockaddrserver.sin_family = AF_INET;//地址族
sockaddrserver.sin_addr.s_addr= inet_addr("192.168.1.114");
sockaddrserver.sin_port = htons(1234);
if (SOCKET_ERROR
== bind(socketserver,(const sockaddr*)&sockaddrserver,sizeof(sockaddr_in) ))
{
int n = GetLastError();
throw "Bind Faild";
}
//4,監聽
if (SOCKET_ERROR == listen(socketserver,10))//隊列的最大長度10
{
throw "Listen Faild";
}
//5,接收
sockaddr_in addrclient;
int nsize = sizeof(addrclient);
cout<<"sssssssssssss"<<endl;
socketwaiter = accept(socketserver,(sockaddr*)&addrclient,&nsize);
if (INVALID_SOCKET == socketwaiter)
{
int n = GetLastError();
throw "Accept Failed";
}
//接收文件頭
FileInfo fi;
//接收文件頭
recv(socketwaiter,(char *)&fi,sizeof FileInfo,0);
char szpath[MAX_PATH] = "E:\\";
strcat_s(szpath,MAX_PATH,fi.GetFileName());
//創建文件
fstream fs;
fs.open(szpath,fstream::out|fstream::binary|fstream::trunc);
if (!fs)
{
throw "sdasdasdada";
}
char szbuf[4*1024] = {0};
//接收文件內容
int filesize = fi.GetFileSize();
while (filesize)
{
int nrelRecvNum = recv(socketwaiter,szbuf,sizeof(szbuf),0);
if (nrelRecvNum > 0)
{
filesize -= nrelRecvNum;
fs.write(szbuf,nrelRecvNum);
}
}
fs.close();
}
catch(int nerror)
{
switch (nerror)
{
case 1:
break;
}
return 0;
}
catch( char *szname)
{
cout<<endl;
cout<<"傻逼了吧"<<endl;
WSACleanup();
if (socketserver)
{
closesocket(socketserver);
socketserver = NULL;
}
return 0;
}
closesocket(socketserver);
closesocket(socketwaiter);
WSACleanup();
system("pause");
return 0;
}
客戶端就是發送端:
客戶端代碼:
#include <iostream>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <windows.h>
#include <fstream>
using namespace std;
#pragma comment(lib, "ws2_32.lib")
class FileInfo
{
public:
void SetFileName(char *szname)
{
strcpy_s(m_szfilename,MAX_PATH,szname);
}
char *GetFileName()
{
return m_szfilename;
}
void SetFileSize(DWORD dwfilesize)
{
m_dwfilesize = dwfilesize;
}
DWORD GetFileSize()
{
return m_dwfilesize;
}
private:
char m_szfilename[MAX_PATH];
DWORD m_dwfilesize;
};
int main()
{
//1,載入庫;
WORD wVersionRequested;
WSADATA wsaData;
int err;
SOCKET socketclient;
try
{
wVersionRequested = MAKEWORD(2, 2);
err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0) {
throw err;
}
if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2) {
throw 2;
}
else
printf("The Winsock 2.2 dll was found okay\n");
//2,創建套接字
socketclient = socket(AF_INET,SOCK_STREAM ,IPPROTO_TCP);
if (socketclient == INVALID_SOCKET )
{
throw "Create Failed";
}
//3.
sockaddr_in addrock;
addrock.sin_family = AF_INET;
addrock.sin_addr.s_addr= inet_addr("192.168.1.114");
addrock.sin_port = htons(1234);
//創建socket
if (SOCKET_ERROR == connect(socketclient,(sockaddr *)&addrock,sizeof(addrock)))
{
throw "sdada";
}
//獲得文件頭信息
char szfilename[MAX_PATH] = "C:\\Users\\Public\\Pictures\\Sample Pictures\\benbenla-07c.jpg";
fstream fs;
fs.open(szfilename,fstream::binary|fstream::in);
if (!fs)
{
throw "ssss";
}
fs.seekg(0,fstream::end);
int nfilesize = fs.tellg();
fs.seekg(0,fstream::beg);
//文件信息
FileInfo fi;
fi.SetFileName("benbenla-07c.jpg");
fi.SetFileSize(nfilesize);
//發送文件頭
send(socketclient,(char *)&fi,sizeof FileInfo,0);
//獲得文件的內容
char szbuf[4*1024] = {0};
//發送文件內容
while (1)
{
fs.read(szbuf,4096);//一次讀4096
int nRelReadNum = fs.gcount();//獲得當前位元組數
if (nRelReadNum == 0)
{
break;
}
int n = send(socketclient,szbuf,nRelReadNum,0);
}
fs.close();
}
catch(int nerror)
{
switch (nerror)
{
case 1:
break;
}
return 0;
}
catch( char *szname)
{
WSACleanup();
if (socketclient)
{
closesocket(socketclient);
socketclient = NULL;
}
return 0;
}
closesocket(socketclient);
//6,卸載庫
WSACleanup( );
system("pause");
return 0;
}