Win32 網路程式設計
1.socket
socket的英文原義是“孔”或“插座”。作為4BDS UNIX的程序通訊機制,取後一種意思。通常也稱作"套接字",用於描述IP地址和埠,是一個通訊鏈的控制代碼。socket非常類似於電話插座。以一個國家級電話網為例。電話的通話雙方相當於相互通訊的2個程序,區號是它的網路地址;區內一個單位的交換機相當於一臺主機,主機分配給每個使用者的局內號碼相當於socket號。任何使用者在通話之前,首先要佔有一部電話機,相當於申請一個socket;同時要知道對方的號碼,相當於對方有一個固定的socket。然後向對方撥號呼叫,相當於發出連線請求(假如對方不在同一區內,還要撥對方區號,相當於給出網路地址)。對方假如在場並空閒(相當於通訊的另一主機開機且可以接受連線請求),拿起電話話筒,雙方就可以正式通話,相當於連線成功。雙方通話的過程,是一方向電話機發出訊號和對方從電話機接收訊號的過程,相當於向socket傳送資料和從socket接收資料。通話結束後,一方掛起電話機相當於關閉socket,撤消連線。socket實質上提供了程序通訊的端點。程序通訊之前,雙方首先必須各自建立一個端點,否則是沒有辦法建立聯絡並相互通訊的。正如打電話之前,雙方必須各自擁有一臺電話機一樣。在網間網內部,每一個socket用一個半相關描述: (協議,本地地址,本地埠) 一個完整的socket有一個本地唯一的socket號,由作業系統分配。套接字存在於通訊區域中,通訊區域也叫地址族,主要用於將通過套接字通訊的程序的共有特性綜合在一起,套接字通常只與同一區域的套接字交換資料。Windows Sockets只支援一個通訊區域:網際域(AF_INET),這個域被使用網際協議簇通訊的程序使用。TCP/IP協議使用16位整數和32位整數的高位先存格式。
2.IP地址:IP網路中每臺主機都必須有一個惟一的IP地址,IP地址是一個邏輯地址,因特網上的IP地址具有全球惟一性,32位,4個位元組,常用點分十進位制格式表示。
3.協議:為進行網路中的資料交換(通訊)而建立的規則、標準或約定(語義+語法+規則);不同層具有各自不同的協議。
4.ISO/OSI(Open System Interconnection)七層參考模型:物理層:提供二進位制傳輸,確定在通訊通道上如何傳輸位元流;資料鏈路層:提供介質訪問,加強物理層的傳輸功能,建立一條無差錯的傳輸線路;網路層:提供IP定址和路由,因為在網路上資料可以經由多條線路到達目的地,網路層負責找出最佳的傳輸線路。傳輸層:為源端主機到目的端主機提供可靠的資料傳輸服務,隔離網路的上下層協議,使得網路應用與下層協議無關。會話層:在兩個相互通訊的應用程序之間建立、組織和協調其相互之間的通訊。表示層:處理被傳送資料的表示問題,即資訊的語法和語義。應用層:為使用者的網路應用程式提供網路通訊的服務。在兩個通訊實體進行通訊時,應用層所發出的資料經過表示層、會話層、傳輸層、網路層、資料鏈路層,最終到達物理層,在該層通過物理線路傳輸給另一個實體的物理層。然後,資料再依次向上傳遞,傳遞給另一個實體的應用層。對等層通訊的實質:對等層實體之間虛擬通訊,下層向上層提供服務,實際通訊在最底層完成。
應用層協議:遠端登入協議Telnet.檔案傳輸協議FTP,超文字傳輸協議HTTP,域名服務DNS,簡單郵件傳輸協議SMTP,郵局協議POP3;傳輸層協議:TCP:面向連線的可靠的傳輸協議,利用TCP協議進行通訊時,首先要通過三步握手,以建立通訊雙方的連線。一旦連線建立好,就可以進行通訊了。TCP提供了資料確認和資料重傳的機制,保證了傳送的資料一定能到達通訊的對方。UDP:無連線的,不可靠的傳輸協議。採用UDP進行通訊時,不需要建立連線,可以直接向一個IP地址傳送資料,但是對方能否收到,無法保證。主要用在一些實時性要求較高的場合。網路層:網際協議IP,Internet網際網路控制報文ICMP,Internet組管理協議IGMP
4.TCP/IP:應用層、傳輸層、網路層和網路介面層。
5.埠:是一種抽象的軟體結構(包括一些資料結構和I/O緩衝區)。應用程式通過系統呼叫與某埠建立連線後,傳輸層傳給該埠的資料都被相應的程序所接收,相應程序發給傳輸層的資料都通過該埠輸出。埠用一個整數型識別符號來表示,即埠號。埠使用一個16位的數字來表示,範圍是0-65535,1024以下的埠號保留給預定義的服務。
6.客戶機/伺服器模式:在TCP/IP網路應用中,通訊的兩個程序間相互作用的主要模式是客戶機/伺服器模式。
7.套接字的型別:流式套接字(SOCK_STREAM)提供面向連線、可靠的資料傳輸服務,資料無差錯,無重複的傳送,且按傳送順序接收,實際上是基於TCP協議實現的。資料報式套接字(SOCK_DGRAM)提供無連線服務,資料包以獨立句形式傳送,不提供無錯保證,資料可能丟失或重複。並且接收順序混亂。實際上是基於UDP協議實現。原始套接字(SOCK_RAW)
8.面向TCP的socket程式設計:伺服器端:1.建立套接字,(socket)2.將套接字繫結到一個本地地址和埠上(bind)3.將套接字設為監聽模式,準備接收客戶請求(listen)4.等待客戶請求到來,當請求到來後,接收連線請求,返回一個新的對應於此次連線的套接字。(accept)5.用返回的套接字和客戶端進行通訊。(send/recv)6.返回,等待另一客戶請求7.關閉套接字。
客戶端:1.建立套接字(socket)2.向伺服器發出連線請求(connect)3.和伺服器進行通訊(send/recv)4.關閉套接字
9.基於UDP的socket程式設計:伺服器端即先啟動的一端為接收端,傳送資料的一端為傳送端,也稱客戶端。接收端程式:建立套接字,將套接字繫結到一個本地址和埠上,等待接收資料(recvfrom),關閉套接字。客戶端程式:建立套接字,向伺服器傳送資料(sendto),關閉套接字。
套接字相當於電話機,IP地址相當於總機,埠號相當於分機。
相關函式:1.載入套接字型檔 int WSAStartup ( WORD
wVersionRequested, LPWSADATA lpWSAData );
wVersionRequested [in] The highest version of Windows Sockets support that thecaller can use. The high order byte specifies the minor version (revision)number(副版本號); thelow-order byte specifies the major version number(主版本號)。lpWSAData [out] A pointer to the
WSADATAdata structure that is to receive details of the Windows Socketsimplementation.
typedef struct WSAData {
WORD wVersion;
WORD wHighVersion;
char szDescription[WSADESCRIPTION_LEN+1];
char szSystemStatus[WSASYS_STATUS_LEN+1];
unsigned short iMaxSockets;
unsigned short iMaxUdpDg;
char FAR * lpVendorInfo;
} WSADATA, FAR * LPWSADATA;
An application must call one WSACleanup call for every successfulWSAStartup call to allow third-party DLLs to make use of a WS2_32.DLL on behalfof an application.
2.socket函式:The Windows Sockets socket function creates a socket that is boundto a specific service provider。
SOCKET socket ( int af, inttype, int protocol );
3.bind函式:The Windows Sockets bind function associatesa local address with a socket.
int bind ( SOCKET s, const struct sockaddr FAR* name, int namelen);
s [in] A descriptor identifying an unbound socket. name [in] The address toassign to the socket from the
SOCKADDRstructure. namelen [in] The length of the name.
The SOCKADDR structure varies depending on the protocol selected.Except for the sa_family field, SOCKADDR contents are expressed in network byteorder.
struct sockaddr {
u_short sa_family;
char sa_data[14];
};
The bind function is used on an unconnected socket before subsequentcalls to the connector listenfunctions. It is used to bind to either connection-oriented (stream) orconnectionless (datagram) sockets. When a socket is created with a call to the socketfunction, it exists in a name space (address family), but it has no nameassigned to it. Use bind to establish the local association of the socket byassigning a local name to an unnamed socket. sa_data僅僅表示要求一塊記憶體分配區,起到佔位的作用,該區域中指定與協議相關的具體地址資訊。由於實際要求的只是記憶體區,所以對不同的協議家族,用不同的結構來替換sockaddr.。在基於TCP/IP的socket編輯過程中,可以用sockaddr_in結構替換sockaddr。
struct sockaddr_in{
short sin_family;
unsigned short sin_port;
struct in_addr sin_addr;
char sin_zero[8];
};
In the Internet address family, the SOCKADDR_IN structure is used byWindows Sockets to specify a local or remote endpoint address to which toconnect a socket. This is the form of the SOCKADDR structure specific to theInternet address family and can be cast to SOCKADDR. sin_port:要分配給套接字的埠;sin_addr:套接字的主機IP地址。
struct in_addr {
union {
struct { u_char s_b1,s_b2,s_b3,s_b4; } S_un_b;
struct { u_short s_w1,s_w2; } S_un_w;
u_long S_addr;
} S_un;
4.inet_addr:將IP地址指定為INADDR_ANY,允許套接字向任何分配給本地機器的IP地址傳送或接受資料。若只想讓套接字使用多個IP中的一個地址,就必須指定實際地址,可用inet_addr函式實現。
unsigned long inet_addr ( const char FAR * cp );The Windows Socketsinet_addr function converts a string containing an (Ipv4) Internet Protocoldotted address into a proper address for the IN_ADDRstructure.
char FAR * inet_ntoa ( struct in_addr in );The Windows Socketsinet_ntoa function converts an (Ipv4) Internet network address into a string inInternet standard dotted format.返回一個以點分十進位制格式表示的IP地址字串。
5.listen函式:int listen ( SOCKET s, int backlog ); TheWindows Sockets listen function places a socket a state where it is listeningfor an incoming connection.
6.accept函式:SOCKET accept ( SOCKET s, struct sockaddr FAR* addr, int FAR*addrlen );The Windows Sockets accept function accepts an incoming connectionattempt on a socket.addr:指向一個緩衝區的指標,該緩衝區用來接收連線實體的地址,就是當客戶端向伺服器發起連線,伺服器接受這個連線時,儲存發起連線的這個客戶端的IP地址資訊和埠資訊。
7.send函式:
int send ( SOCKET s, const char FAR * buf, int len, int flags);
The Windows Sockets send function sends data on a connected socket.
8.recv函式:int recv (SOCKET s, char FAR* buf, int len, int flags );
The Windows Sockets recv function receives data from a connected socket.
9.connect函式:int connect (SOCKET s,const struct sockaddrFAR* name, int namelen );
The Windows Sockets connect function establishes a connection to a specifedsocket.
10.recvfrom函式:
int recvfrom ( SOCKET s, char FAR* buf,int len,int flags, struct sockaddr FAR* from, int FAR*fromlen );
The Windows Sockets recvfrom function receives a datagram and stores the sourceaddress.
11.sendto函式:int sendto (SOCKET s, const char FAR * buf, int len,int flags,conststructsockaddr FAR * to, int tolen);
The Windows Sockets sendto function sends data to a specific destination.
12.htons htonl函式:u_short htons (u_short hostshort );The Windows Sockets htonsfunction converts a u_short from host to TCP/IP network byte order (which isbig-endian).
u_long htonl ( u_long hostlong);
The Windows Sockets htonl function converts a u_long from host toTCP/IP network byte order (which is big-endian).
伺服器端程式:
#include <Winsock2.h>
#include <stdio.h>
void main(void)
{
WSADATA wsaData;
SOCKET sockSrv;
SOCKADDR_IN addrSrv;
SOCKADDR_IN addrClient;//用來接受客戶端的地址資訊
int len=sizeof(SOCKADDR);
WORD wVersionRequested;//儲存WinSock庫的版本號
int err;
wVersionRequested =MAKEWORD(2,2);//建立一個包含了請求版本號的WORD值
err =WSAStartup(wVersionRequested, &wsaData);//載入套接字型檔
if ( err != 0 ) {//返回值不等於0,程式退出。
return;
}
if ( LOBYTE(wsaData.wVersion ) != 2 ||
HIBYTE(wsaData.wVersion ) != 2 ) {//判斷低位元組和高位元組是否都等於1
WSACleanup( );//不是的話,呼叫該函式,終止對Winsock庫的使用並返回
return;
}
sockSrv=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);//建立套接字
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));//將套接字繫結到本地址和指定的埠號上。
listen(sockSrv,5);
while(1)//作為伺服器端,需要不斷地等待客戶端的連線請求的到來,在此設定死迴圈。
{
char recvBuf[100];
char sendBuf[100];//於當前這個新連線的一個套接字描述符,保存於sockConn變數中,利用這個套接字就可以與客戶端通訊。先前的套接字仍繼續監聽客戶端的連線請求。
//返回連線狀態的套接字
SOCKETsockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);//當客戶端連線請求到來時,該函式接受該請求,建立連線,同時它將返回一個相對
sprintf(sendBuf,"Welcome%s you",inet_ntoa(addrClient.sin_addr));
send(sockConn,sendBuf,strlen(sendBuf)+1,0);//用返回的套接字和客戶端進行通訊。
recv(sockConn,recvBuf,100,0);//從客戶端接受資料
printf("%s\n",recvBuf);
closesocket(sockConn);//當前通訊完成之後,需要呼叫closesocket函式關閉已建立的套接字,釋放為該套接字分配的資源,
}//然後進入下一個迴圈,等待另一客戶請求的到來。若不是死迴圈的話,此處還需呼叫WSACleanup函式終止對套接字型檔的使用。
}
客戶端程式:
#include <Winsock2.h>
#include <stdio.h>
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested =MAKEWORD( 1, 1 );
err = WSAStartup( wVersionRequested,&wsaData );
if ( err != 0 ) {
return;
}
if ( LOBYTE(wsaData.wVersion ) != 1 ||
HIBYTE(wsaData.wVersion ) != 1 ) {
WSACleanup( );
return;
}
SOCKETsockClient=socket(AF_INET,SOCK_STREAM,0);//將其第三個引數設為0,讓其自動選擇協議。
SOCKADDR_IN addrSrv;//設定伺服器端的IP和埠
addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");//本地迴路地址
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));//與伺服器建立連線。
char recvBuf[100];
recv(sockClient,recvBuf,100,0);
printf("%s\n",recvBuf);
send(sockClient,"Thisis zhangsan",strlen("This is Isir")+1,0);
closesocket(sockClient);
WSACleanup();
}
基於UDP的網路程式設計:
伺服器端:
#include <Winsock2.h>
#include <stdio.h>
/* UDP Server */
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested =MAKEWORD(2,2);
err = WSAStartup(wVersionRequested, &wsaData );
if ( err != 0 ) {
return;
}
if ( LOBYTE(wsaData.wVersion ) != 2 ||
HIBYTE(wsaData.wVersion ) != 2 ) {
WSACleanup( );
return;
}
SOCKETsockSrv=socket(AF_INET,SOCK_DGRAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
char recvBuf[100];
char sendBuf[100];
char tempBuf[200];
SOCKADDR_IN addrClient;
int len=sizeof(SOCKADDR);
while (1)
{
recvfrom(sockSrv,recvBuf,100,0,(SOCKADDR*)&addrClient,&len);
if ('q' ==recvBuf[0])
{
sendto(sockSrv,"q",strlen("q")+1,0,(SOCKADDR *)&addrClient,len);
printf("chatend\n");
break;
}
sprintf(tempBuf,"%ssay:%s",inet_ntoa(addrClient.sin_addr),recvBuf);
printf("%s\n",tempBuf);
printf("Pleaseinput data:\n");
gets(sendBuf);
sendto(sockSrv,sendBuf,strlen(sendBuf)+1,0,(SOCKADDR*)&addrClient,len);
}
closesocket(sockSrv);
WSACleanup();
}
}
客戶端:
#include <Winsock2.h>
#include <stdio.h>
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
SOCKET sockClient;
SOCKADDR_IN addrSrv;
char recvBuf[100];
char sendBuf[100];
char tempBuf[200];
int len =sizeof(SOCKADDR);
int err;
wVersionRequested =MAKEWORD(2,2);
err = WSAStartup(wVersionRequested, &wsaData );
if ( err != 0 ) {
return;
}
if ( LOBYTE(wsaData.wVersion ) != 2 ||
HIBYTE(wsaData.wVersion ) != 2 ) {
WSACleanup( );
return;
}
sockClient =socket(AF_INET,SOCK_DGRAM,0);
addrSrv.sin_addr.S_un.S_addr= inet_addr("127.0.0.1");
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
while (1)
{
printf("pleaseinput data:\n");
gets(sendBuf);
sendto(sockClient,sendBuf,strlen(sendBuf)+1,0
,(SOCKADDR*)&addrSrv,len);
recvfrom(sockClient,recvBuf,100,0,(SOCKADDR*)&addrSrv,&len);
if ('q' ==recvBuf[0])
{
sendto(sockClient,"q",strlen("q")+1,0,
(SOCKADDR*)&addrSrv,len);
printf("chatend;\n");
break;
}
sprintf(tempBuf,"%s say :%s",inet_ntoa(addrSrv.sin_addr),recvBuf);
printf("%s\n",tempBuf);
}
closesocket(sockClient);
WSACleanup();
}
P.s.
àALT + F8 :對其文件格式
相關推薦
Win32 網路程式設計
1.socket socket的英文原義是“孔”或“插座”。作為4BDS UNIX的程序通訊機制,取後一種意思。通常也稱作"套接字",用於描述IP地址和埠,是一個通訊鏈的控制代碼。socket非常類似於電話插座。以一個國家級電話網為例。電話的通話雙方相當於相互通訊的2個程序
6.win32網路程式設計(二).recv函式的緩衝區大小的問題
繼續之前的在VC++上的win32網路程式設計版本,這次試試在VS上執行: 開發環境:VS2015 和 VS2013 這次在跑之前的程式碼的時候,發現有幾個bug: 1. 客戶端並沒有send,服務端會繼續呼叫recv函式(而不是被阻塞),接收到一大片的空字元緩衝 發現好像
Win32 網路程式設計中fd_set型別重定義問題
問題:Win32 網路程式設計中fd_set型別重定義 D:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\PlatformSDK\Include\WinSock2.h(109):
UDP網路程式設計
UDP套介面是無連線的、不可靠的資料報協議;既然他不可靠為什麼還要用呢?其一:當應用程式使用廣播或多播時只能使用UDP協議;其二:由於他是無連線的,所以速度快。 因為UDP套介面是無連線的,如果一方的資料報丟失,那另一方將無限等待,解決辦法是設定一個超時。 建立UDP套介面時socket函式
java:socket 網路程式設計
socket的通俗解釋: 套接字=主機+埠號。兩個東西配在一起,叫做“配套”。 另外“套”也有對應的意思,它可以把網路上的兩個應用對應起來,所以用“套”。 它是用來與另一個應用連線的,所以用“接”。 又因為它是一小段資料,很小一小段,所以叫“字”。 “套接字",就是一小段用來將網路個兩個應用
[Socket網路程式設計]一個封鎖操作被對 WSACancelBlockingCall 的呼叫中斷。
原文地址:http://www.cnblogs.com/xiwang/archive/2012/10/25/2740114.html記錄在此,方便查閱。 C#中在使用UDPClient迴圈監聽埠,在斷開UPDClient的時候,使用try...catch捕獲了異常,System.NET.Socket
GO語言使用之網路程式設計(TCP程式設計)
一、基本介紹 Golang的主要設計目標之一就是面向大規模後端服務程式,網路通訊這塊是服務端 程式必不可少也是至關重要的一部分。 1、 網路程式設計有兩種: 1) TCP socket程式設計,是網路程式設計的主流。之所以叫Tcp socket程式設計,是因為底層是基於Tcp/i
圖文詳解之網路程式設計!
1.網路程式設計 什麼是網路程式設計 多臺計算機連線形成網路 網路的作用 資料互動 資料共享 2.網路三要素 網路協議:雙方實體完成通訊或服務所必須遵循的規則和約定 &
淺談網路程式設計之Socket
前言 此文只是簡單概述Socket,Java程式設計的使用方法,還請移步Java 網路IO程式設計 Socket Socket是用來連線網路,進行傳輸資料的工具,Scoket大致分為兩種,TCP和UDP TCP: 服務端:建立Socket->繫結ip和埠號->接聽連線-&
網路程式設計(InetAddress類、Socket和ServerSocket、實現客戶端和伺服器之間的雙向通訊)
網路程式設計的底層是IO,通過IO將一臺計算機中的資料傳送到另一臺計算機中。傳送的時候,要知道接受方的地址,該地址即為IP地址。知道IP地址後即可進行傳送。A向B發訊息,訊息是發過去了,但是B要怎樣接受呢?因此定義了埠,B監聽了A所使用的埠。A發的訊息中含有埠號,當B接受到訊息時,知道了埠號
簡單遠端遙控程式【網路程式設計 - 簡單遠端遙控程式,C實現】
實驗內容 基於Windows下Winsocket程式設計 實現 1.list (顯示伺服器端當前路徑下所有檔案) 2.get 遠端檔案路徑 本地檔案路徑 (下載遠端檔案 到 本地檔案路徑 ) 3.port 本地檔案路徑 遠端檔案路徑 (上傳 本地檔案 到 本地檔案路徑下 ) 4.quit (退出程式) 參
淺談 TCP/IP 網路程式設計中 socket 的行為
來源:PromisE_謝 連結:www.cnblogs.com/promise6522/archive/2012/03/03/2377935.html 我認為,想要熟練掌握 Linux 下的 TCP/IP 網路程式設計,至少有三個層面的知識需要熟悉: TCP/IP
Python_day6:socket網路程式設計
一、socket socket即套接字,用於描述IP地址和埠,是一個通訊鏈的控制代碼,應用程式通常通過"套接字"向網路發出請求或者應答網路請求。 最簡單的socket,一次 1 import socket 2 server = socket.socket() #獲得例項
python學習第31天之異常處理、網路程式設計part1
一,異常處理 1. 什麼是異常處理 異常是錯誤發生的訊號,一旦程式出錯就會產生一個異常,如果該異常 沒有被應用程式處理,那麼該異常就會丟擲來,程式的執行也隨之終止 異常包含三個部分:(1). traceback異常的追蹤資訊(2). 異常的型別(3). 異常的資訊 2. 為何要異常處理 避免程式因
python_day26__socket網路程式設計基礎程式設計知識
server.py (server服務端): #Author:'haijing'#date:2018/10/30#服務端:在別人的哪裡import socket #socket是一個介面 內部封裝了有關ip地址和埠號的資訊 並且建立ip和埠號#在socket類中family=AE_INET type=SO
網路程式設計基礎【day08】:簡單socket例項(二)
本節內容 1、概述 2、socket例項 3、總結 一、概述 之前我們只是介紹了soket的概念和一些邏輯圖表,下面我們來看看,socket的客戶端和服務端到底是怎麼用的? 二、socket例項 2.1 客戶端 2.1.1 客戶端程式碼邏輯圖 2.1.2 客戶端程式碼
網路程式設計基礎【day09】:socket接收大資料(五)
本節內容 1、概述 2、socket接收大資料 3、中文字元的坑 一、概述 上篇部落格寫到了,就是說當伺服器傳送至客戶端的資料,大於客戶端設定的資料,則就會把資料服務端發過來的資料剩餘資料存在IO緩衝區中,那我們如何解決這個問題呢? 有的同學就說了: 改大客戶端接收的資料的大小=&
網路程式設計基礎【day09】:socket解決粘包問題之MD5(八)
本節內容 1、概述 2、程式碼實現 一、概述 上一篇部落格講到的用MD5來校驗還是用的之前解決粘包的方法,就是客戶端傳送一個請求,等待服務端的確認的這樣的一個笨方法。下面我們用另外一種方法:就是客戶端已經知道可接收多少資料了,既然客戶端已經知道接收多少資料了,那麼客戶端在接收資料的時候,正好接收已
網路程式設計的基礎
網路程式設計 應用軟體的架構 1、C/S client===>server 客戶端到服務端 2、B/S browser===》server 瀏覽器端到服務端 在不同的計算機上,一個安裝客戶端另一安裝服務端 通過網路來通訊 什麼是網路通訊? 要完成通訊必須具
網路程式設計基礎【day10】:我是一個程序(三)
一、引子 我聽說我的祖先們生活在專用計算機裡, 一生只幫助人類做一件事情,比說微積分運算 了、人口統計了 、生成密碼、甚至通過織布機印花 ! 如果你想在這些專用“計算機”上乾點別的事兒,例如安裝個遊戲玩玩, 那是絕對不可能的, 除非你把它拆掉, 然後建一個全新的機器。