1. 程式人生 > >Win32 網路程式設計

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】:我是一個程序(三)

一、引子 我聽說我的祖先們生活在專用計算機裡, 一生只幫助人類做一件事情,比說微積分運算 了、人口統計了 、生成密碼、甚至通過織布機印花 !   如果你想在這些專用“計算機”上乾點別的事兒,例如安裝個遊戲玩玩, 那是絕對不可能的, 除非你把它拆掉, 然後建一個全新的機器。