程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 在TCP協議下的數據傳送,TCP協議數據傳送

在TCP協議下的數據傳送,TCP協議數據傳送

編輯:C++入門知識

在TCP協議下的數據傳送,TCP協議數據傳送


 

本人小白菜逼一枚,,,,剛建立博客,也寫不了太深入的,就寫點上課的筆記什麼的。有錯誤希望廣大博友指出,我一定虛心學習接收改正。

我的新浪郵箱:[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;
}

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved