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服务端程序:

[cpp]  view plain  copy
  1. #include <WINSOCK2.H>  
  2. #include <stdio.h>  
  3. void main()  
  4. {  
  5.     WORD wVersionRequested;  
  6.     WSADATA wsaData;  
  7.     int err;  
  8.       
  9.     wVersionRequested = MAKEWORD( 1, 1 );  
  10.       
  11.     err = WSAStartup( wVersionRequested, &wsaData );  
  12.     if ( err != 0 ) {  
  13.         return;  
  14.     }  
  15.       
  16.     if ( LOBYTE( wsaData.wVersion ) != 1 ||  
  17.         HIBYTE( wsaData.wVersion ) != 1 ) {  
  18.         WSACleanup( );  
  19.         return;   
  20.     }  
  21.     SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);  
  22.   
  23.     SOCKADDR_IN addrSrv;  
  24.     addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);  
  25.     addrSrv.sin_family=AF_INET;  
  26.     addrSrv.sin_port=htons(6000);  
  27.   
  28.     bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));  
  29.   
  30.     listen(sockSrv,5);  
  31.   
  32.     SOCKADDR_IN addrClient;  
  33.     int len=sizeof(SOCKADDR);  
  34.   
  35.     while(1)  
  36.     {  
  37.         SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);  
  38.         char sendBuf[100];  
  39.         sprintf(sendBuf,"Welcome %s to 刘洼村",inet_ntoa(addrClient.sin_addr));  
  40.         send(sockConn,sendBuf,strlen(sendBuf)+1,0);  
  41.         char recvBuf[100];  
  42.         recv(sockConn,recvBuf,100,0);  
  43.         printf("%s\n",recvBuf);  
  44.         closesocket(sockConn);  
  45.           
  46.     }  
  47.   
  48. }  

24.    Tcp客户端程序:

[cpp]  view plain  copy
  1. #include <WINSOCK2.H>  
  2. #include <stdio.h>  
  3. void main()  
  4. {  
  5.     WORD wVersionRequested;  
  6.     WSADATA wsaData;  
  7.     int err;  
  8.       
  9.     wVersionRequested = MAKEWORD( 1, 1 );  
  10.       
  11.     err = WSAStartup( wVersionRequested, &wsaData );  
  12.     if ( err != 0 ) {  
  13.         return;  
  14.     }  
  15.       
  16.     if ( LOBYTE( wsaData.wVersion ) != 1 ||  
  17.         HIBYTE( wsaData.wVersion ) != 1 ) {  
  18.         WSACleanup( );  
  19.         return;   
  20.     }  
  21.     SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);  
  22.   
  23.     SOCKADDR_IN addrSrv;  
  24.     addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");//服务器端的地址  
  25.     addrSrv.sin_family=AF_INET;  
  26.     addrSrv.sin_port=htons(6000);  
  27.     connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));  
  28.   
  29.     char recvBuf[100];  
  30.     recv(sockClient,recvBuf,100,0);  
  31.     printf("%s\n",recvBuf);  
  32.     send(sockClient,"This is 刘洼村",strlen("This is 刘洼村")+1,0);  
  33.   
  34.     closesocket(sockClient);  
  35.     WSACleanup();  
  36. }  

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服务器端程序:

[cpp]  view plain  copy
  1. #include <WINSOCK2.H>  
  2. #include <stdio.h>  
  3.   
  4. void main()  
  5. {  
  6.     WORD wVersionRequested;  
  7.     WSADATA wsaData;  
  8.     int err;  
  9.       
  10.     wVersionRequested = MAKEWORD( 1, 1 );  
  11.       
  12.     err = WSAStartup( wVersionRequested, &wsaData );  
  13.     if ( err != 0 ) {  
  14.         return;  
  15.     }  
  16.       
  17.     if ( LOBYTE( wsaData.wVersion ) != 1 ||  
  18.         HIBYTE( wsaData.wVersion ) != 1 ) {  
  19.         WSACleanup( );  
  20.         return;   
  21.     }  
  22.   
  23.     SOCKET sockSrv=socket(AF_INET,SOCK_DGRAM,0);  
  24.     SOCKADDR_IN addrSrv;  
  25.     addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);  
  26.     addrSrv.sin_family=AF_INET;  
  27.     addrSrv.sin_port=htons(6000);  
  28.   
  29.     bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));  
  30.   
  31.     SOCKADDR_IN addrClient;  
  32.     int len=sizeof(SOCKADDR);  
  33.     char recvBuf[100];  
  34.   
  35.     recvfrom(sockSrv,recvBuf,100,0,(SOCKADDR*)&addrClient,&len);  
  36.     printf("%s\n",recvBuf);  
  37.     closesocket(sockSrv);  
  38.     WSACleanup();  
  39.   
  40. }  

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客户端程序

[cpp]  view plain  copy
  1. #include <WINSOCK2.H>  
  2. #include <stdio.h>  
  3.   
  4. void main()  
  5. {  
  6.     WORD wVersionRequested;  
  7.     WSADATA wsaData;  
  8.     int err;  
  9.       
  10.     wVersionRequested = MAKEWORD( 1, 1 );  
  11.       
  12.     err = WSAStartup( wVersionRequested, &wsaData );  
  13.     if ( err != 0 ) {  
  14.         return;  
  15.     }  
  16.       
  17.     if ( LOBYTE( wsaData.wVersion ) != 1 ||  
  18.         HIBYTE( wsaData.wVersion ) != 1 ) {  
  19.         WSACleanup( );  
  20.         return;   
  21.     }  
  22.       
  23.     SOCKET sockClient=socket(AF_INET,SOCK_DGRAM,0);  
  24.     SOCKADDR_IN addrSrv;  
  25.     addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");  
  26.     addrSrv.sin_family=AF_INET;  
  27.     addrSrv.sin_port=htons(6000);  
  28.   
  29.     sendto(sockClient,"Hello 刘洼村",strlen("Hello 刘洼村")+1,0,  
  30.         (SOCKADDR*)&addrSrv,sizeof(SOCKADDR));  
  31.     closesocket(sockClient);  
  32.     WSACleanup();  
  33. }  
运行结果:

30.  注意:每个程序都要加上ws2_32.lib链接库。如下添加:

猜你喜欢

转载自blog.csdn.net/u012422855/article/details/78120748
今日推荐