1. 程式人生 > >VC++ socket通訊例項 總結

VC++ socket通訊例項 總結

1.        兩天計算機通訊需要協議,通訊的兩臺計算機IP必須唯一

2.        同一個計算機可以進行多個應用程式與其他計算機通訊,IP地址唯一,而埠號是區別同一計算機(同一IP)的唯一標示。

3.        實際上就類似於一個辦公室的總機號碼(IP)和分機號碼(埠號)

4.        協議:為了進行網路中的資料交換(通訊)而建立的規則、標準或約定

5.        協議=語義+語法+規則

6.        不同層具有各自不同的協議

7.        上層使用下層提供的服務,實際通訊在最底層完成

8.        對等層實體之間虛擬通訊|

9.        TCP:面向連線的可靠的傳輸協議

10.    UDP:面向無連線的不可靠的傳輸協議

11.    埠是一種抽象的軟體結構。應用程式通過系統呼叫與某埠建立連線後,傳輸層傳給埠的資料都被響應的進行所接收,相應程序發給傳輸層的資料都通過該埠輸出。

12.    埠用一個整數型標示符來表示。埠號跟協議相關,TCP/IP傳輸層的兩個協議TCP和UDP是完全獨立的兩個軟體模組,因此各自的埠號也相互獨立。

13.    埠使用一個16位的數字來表示,它的範圍是0~65535,1024以下的埠號保留給預定義的服務。例如:http使用的是80埠。

14.    socket(套接字):windows sockets只支援一個通訊區域:網際域(AF_INET),這個域被使用網際協議簇通訊的程序使用。

15.    C/S模式:客戶機向伺服器提出請求,伺服器接收到請求後,提供相應的服務。

16.    套接字的型別

a)        流式套接字:(SOCK_STREAM):面向連線可靠的資料傳輸服務,按順序接收

b)       資料包式套接字:(SOCK_DGRAM):無連線服務。接收順序混亂。

c)       原始套接字(SOCK_RAM)

17.    基於TCP(面向連線)的socket程式設計

a)        伺服器端程式:

                        i.             建立套接字socket

                      ii.             將套接字繫結到一個本地地址和埠上bind

                     iii.             將套接字設為監聽模式,準備接收客戶請求listen

                    iv.             等待客戶請求到了;當請求到來後,接收連線請求,返回一個新的對應於此次連線的套接字accept

                      v.             用返回的套接字和客戶端進行通訊rend/recv

                    vi.             返回,等待另一客戶請求

                   vii.             關閉套接字

b)       客戶端程式:

                        i.             建立套接字socket

                      ii.             向服務端發出連線請求connect

                     iii.             和伺服器端進行通訊rend/recv

                    iv.             關閉套接字

18.    基於UDP的socket程式設計

a)        伺服器端(接收端)程式:

                        i.             建立套接字socket

                      ii.             將套接字繫結到一個本地地址和埠上bind

                     iii.             等待接收資料recv/from

                    iv.             關閉套接字

b)       客戶端(傳送端)程式:

                        i.             建立套接字socket

                      ii.             向伺服器傳送資料sendto

                     iii.             關閉套接字

19.    int WSAStartup (

  WORD wVersionRequested, //打算使用的最高winsock版本號 
  LPWSADATA lpWSAData  //是個結構體,接收socket的詳細資訊
);

20.    alt+F8:格式化程式碼

21.    面向TCP的連線,伺服器端

a)        套接字

SOCKET socket (
  int af,       //指定地址簇
  int type,     //socket型別
  int protocol  //協議

);

b)       繫結

int bind (
  SOCKET s,                          //要繫結的套接字
  const struct sockaddr FAR*  name,  //指定了該套接字的本地地址資訊
  int namelen                        //該地址結構的長度
);

struct sockaddr {

       u_short    sa_family;

       char       sa_data[14];

};

c)       監聽

int listen (
  SOCKET s,    
  int backlog  
);

d)       接受連線

SOCKET accept (
  SOCKET s,                   
  struct sockaddr FAR* addr
  int FAR* addrlen            
);
e)      傳送
int send (
  SOCKET s,              //建立連線的socket
  const char FAR * buf,  //傳送的資料
  int len,               //傳送資料的長度
  int flags              
);
f)      接收
int recv (
  SOCKET s,       
  char FAR* buf
  int len,        
  int flags       
);
g)      需要的檔案
#include <winsock2.h>
需要連線一個動態連結庫:ws2_32.lib

22.    伺服器端:

a)        Socket

b)       連線:connect

 int connect (
  SOCKET s,                          
  const struct sockaddr FAR*  name
  int namelen                        
);

c)       接收:recv

d)       傳送:send

e)        關閉:closesocket

23.    Tcp服務端程式:

#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; 
	}
	SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,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));

	listen(sockSrv,5);

	SOCKADDR_IN addrClient;
	int len=sizeof(SOCKADDR);

	while(1)
	{
		SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);
		char sendBuf[100];
		sprintf(sendBuf,"Welcome %s to 劉窪村",inet_ntoa(addrClient.sin_addr));
		send(sockConn,sendBuf,strlen(sendBuf)+1,0);
		char recvBuf[100];
		recv(sockConn,recvBuf,100,0);
		printf("%s\n",recvBuf);
		closesocket(sockConn);
		
	}

}

24.    Tcp客戶端程式:

#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; 
	}
	SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);

	SOCKADDR_IN addrSrv;
	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,"This is 劉窪村",strlen("This is 劉窪村")+1,0);

	closesocket(sockClient);
	WSACleanup();
}

25.    執行之後,開啟了6個客戶端,一個伺服器端。程式執行效果:

26.    面向UDP的連線

27.    伺服器:socket

a)        bind

b)       接收資料:

int recvfrom (
  SOCKET s,                   //套接字
  char FAR* buf,              //接收資料
  int len,                    //長度
  int flags,                  //會影響呼叫行為,0
  struct sockaddr FAR* from,  //接收發送方的地址資訊
  int FAR* fromlen            //接收長度
);

c)       關閉closesocket

d)       Cleanup

28.    UDP伺服器端程式:

#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; 
	}

	SOCKET sockSrv=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));

	SOCKADDR_IN addrClient;
	int len=sizeof(SOCKADDR);
	char recvBuf[100];

	recvfrom(sockSrv,recvBuf,100,0,(SOCKADDR*)&addrClient,&len);
	printf("%s\n",recvBuf);
	closesocket(sockSrv);
	WSACleanup();

}

28.    UDP客戶端:

a)        socket定義

b)       傳送:

   int sendto (
  SOCKET s,                        
  const char FAR * buf,            
  int len,                         
  int flags,                       
  const struct sockaddr FAR * to
  int tolen                        
);

 29.  UDP客戶端程式

#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; 
	}
	
	SOCKET sockClient=socket(AF_INET,SOCK_DGRAM,0);
	SOCKADDR_IN addrSrv;
	addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
	addrSrv.sin_family=AF_INET;
	addrSrv.sin_port=htons(6000);

	sendto(sockClient,"Hello 劉窪村",strlen("Hello 劉窪村")+1,0,
		(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
	closesocket(sockClient);
	WSACleanup();
}
執行結果:

30.  注意:每個程式都要加上ws2_32.lib連結庫。如下新增:


                                      By  劉窪村

相關推薦

VC++ socket通訊例項 總結

1.        兩天計算機通訊需要協議,通訊的兩臺計算機IP必須唯一 2.        同一個計算機可以進行多個應用程式與其他計算機通訊,IP地址唯一,而埠號是區別同一計算機(同一IP)的唯一標示。 3.        實際上就類似於一個辦公室的總機號碼(IP)和分機

三、UDP實現簡單的socket通訊例項

1.伺服器端程式碼 package udp; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; /** * 類功能描述:伺服器端,先啟動伺服器端後啟動

二、多執行緒實現簡單的socket通訊例項(TCP)

1.伺服器端 import java.io.*; import java.net.ServerSocket; import java.net.Socket; /** * 類功能描述:先啟動伺服器端,再啟動客戶端 * * @author:*** * @createTime:2018/

一、一個簡單的socket通訊例項(TCP)

  1.服務端程式碼 import java.io.*; import java.net.ServerSocket; import java.net.Socket; /** * 類功能描述:先啟動伺服器端,再啟動客戶端 * * @author:*** * @creat

Java socket通訊例項,簡單入門socket例項程式碼

是不是看了許多socket入門知識,卻還是不能實際運用呢,這篇文章通過利用簡單例項程式講解通過socket實現客戶端與伺服器之間的通訊。這篇文章可以讓你不需要了解socket原理也能利用,便於應急,但建議之後要好好補補關於soket的基礎知識。 首先就是上程式碼,先是伺服器

VC++ socket程式設計例項

1.        兩天計算機通訊需要協議,通訊的兩臺計算機IP必須唯一 2.        同一個計算機可以進行多個應用程式與其他計算機通訊,IP地址唯一,而埠號是區別同一計算機(同一IP)的唯一標示。 3.        實際上就類似於一個辦公室的總機號碼(IP)

Android應用與framework的socket通訊例項

關於Android應用與Framework的socket通訊,相信關心這個問題的朋友們已經看過《android使用socket使底層和framework通訊》這篇文章,美中不足的是作者只貼出一些關鍵的程式碼片段而並沒有放出原始碼。我這裡還是以一個能實際執行的例子為基礎來講,

java NIO socket 通訊例項

java Nio 通訊與Bio通訊主要不同點: 1.Nio中的單個channel即可支援讀操作也可以支援寫操作,而bio中讀操作要用inputstream,寫操作要outputstream. 2.nio 採用byteBuffer 作為記憶體快取區,向channel裡寫或者度

Socket通訊總結

轉: 一、Socket是什麼 二、一些基本概念 三、java socket建立連線的過程   四、Socket 通訊示例 五、建立通訊鏈路 六、服務端程式碼: 七、客戶端程式碼 測試圖例:        因為專案需

Java Socket通訊實現私聊、群聊 WebSocket+Java 私聊、群聊例項

   前言   閒言少敘,上程式碼!     程式碼編寫    server服務端 /** * 服務端 */ public class Server { private static ServerSocket server = null;

socket通訊顯示連線被拒絕問題總結

socket通訊方式         通常使用的是socket通訊模式為c/s模式,就是通過服務端建立連線,並繫結監聽相關的埠,客戶端通過連線至相應的埠,實現使用tcp的三次握手來進行可靠性連線,從而達到資料傳輸。如果對應的客戶端和服務端在同一臺伺服器上,因是資料內部通訊方

Socket通訊總結(附C++實現)

文章目錄[隱藏]        因為專案需要,服務端需要一個SOCKET來接收客戶端的請求,好吧,沒辦法度娘哇,結果很多都是linux的例子,功夫不負有心人啊,終於找到個demo,並且客戶端程式碼詳盡,記錄之,以便以後檢視。 一、Socket是什麼    Socket

C++:實現socket通訊(TCP/IP)例項

       首先宣告,博主之前從來沒有寫過通訊方面的東西,這次之所以寫這個是因為專案需要,因此本文主要介紹一個使用C++語言及Socket來實現TCP/IP通訊的例項,希望可以幫助入門者。 一、什麼是TCP/IP?         TCP提供基於IP環境下的資料可靠性傳

Java Socket實現客戶端與服務端通訊例項

首先,建立一個Server.java的伺服器端類package socket; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.PrintWriter; impor

總結一下五種實現網路爬蟲的方法(一,基於socket通訊編寫爬蟲)

最近呢,由於實習需要呢,複習一遍爬蟲,前斷時間閉關刷題去了,也會把刷題心得總結成部落格分享給大家,比如java集合類特性及原始碼解析,作業系統資料結構的一些演算法,設計模式等,放心,肯定不會鴿的,雖然可能會晚一點寫。言歸正傳,java實現網路爬蟲一般有五種方法(據我所知,要是

C# SOCKET UDP通訊例項

服務端:using System; using System.Collections.Generic; using System.ComponentModel; using System.Data;

Java的Socket通訊簡單例項

服務端 package testlxd; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; im

Android的Socket通訊程式設計例項

Android手機的應用,除了它的手機功能之外,另外一個吸引人的地方在於它的開放性,這一點iphone無法比擬,至少iphone太多商業化氣息。android為我們開啟另一扇交流之窗,而要實現交流,socket通訊必不可少。 java在socket通訊方面上已經有了很

C#.net同步非同步SOCKET通訊和多執行緒總結(5)tcp傳送和接受的程式碼

基於TCP協議的傳送和接收端 TCP協議的接收端 using System.Net.Sockets ; //使用到TcpListen類 using System.Threading ; //使用到執行緒 using System.IO ; //使用到StreamReader類 int port = 800

同步非同步SOCKET通訊和多執行緒總結

 同步套接字通訊 Socket支援下的網上點對點的通訊服務端實現監聽連線,客戶端實現傳送連線請求,建立連線後進行傳送和接收資料的功能  伺服器端建立一個socket,設定好本機的ip和監聽的埠與socket進行繫結,開始監聽連線請求,當接收到連線請求後,傳送確認,同