网络编程socket套接字及其使用(六)

今天继续深入学习socket套接字的使用,上一篇文章我们主要深入介绍了如何使用套接字进行面向连接的通信编程,这里我们主要深入讲解一下基于面向非连接的编程。

对于TCP面向连接来说,在通信前,需要经过三步握手协议以建立连接,而建立连接的过程往往比较耗费时间。连接建立后,在聊天过程中,可能经过好吃一段时间,聊天的双方才会说一句话(网速比较慢的情况比较常见),那么连接是一个保存还是应先断开,等对方说话时再建立连接呢?也就是说,TCP协议的面向连接、数据确认和重传机制将会影响聊天的效率。所以我们就有必要引入另一种协议来填充这个不足缺口。目前通常采用基于UDP非连接的方式来实现。这种方式的特点是不需要建立连接,也没有数据确认和重传机制,因此实时性较高。

下面我们列举一个基于UDP的聊天列举编程进行深入透析:

  1. 服务器端代码:

     1 #include<Winsock2.h>
     2 #include<stdio.h>
     3
     4 void main()
     5 {
     6     //load socket libariy
     7     WORD wVersionRequested;
     8     //this struct use to stored Windows Sockets value after call WSAStartup() function,
     9     //include the data from Winscok.dll
    10     WSADATA wsaData;
    11     int err;
    12     wVersionRequested=MAKEWORD(1,1);
    13     err = WSAStartup(wVersionRequested,&wsaData);
    14     if(err!=0)
    15     {
    16         return;
    17     }
    18     if(LOBYTE(wsaData.wVersion)!=1 || (HIBYTE(wsaData.wVersion)!=1))
    19     {
    20         WSACleanup();
    21         return;
    22     }
    23     //create socket--- Protocol udp
    24     SOCKET sockSrv=socket(AF_INET,SOCK_DGRAM,0);
    25     //Setup socket address information
    26     SOCKADDR_IN addrSrv;
    27     addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
    28     addrSrv.sin_family=AF_INET;
    29     addrSrv.sin_port=htons(6000);
    30     //binding socket with its address and port
    31     if(bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR))==0)
    32     {
    33         printf("Server start...OK!\n");
    34         //data buffer;
    35         char recvBuf[100];
    36         char sendBuf[100];
    37         char tempBuf[200];
    38         //client address information
    39         SOCKADDR_IN addrClient;
    40         int len=sizeof(SOCKADDR);
    41         //endless: to receive client data
    42         while(1)
    43         {
    44             //wait data incomming
    45             recvfrom(sockSrv,recvBuf,100,0,(SOCKADDR*)&addrClient,&len);
    46             //only receive ‘q‘ or ‘Q‘, stop.
    47             if((‘q‘==recvBuf[0])||(‘Q‘)==recvBuf[0])
    48             {
    49                 if(strlen(recvBuf)==1)
    50                 {
    51                     //chat end
    52                     sendto(sockSrv,"q",strlen("q")+1,0,(SOCKADDR*)&addrClient,len);
    53                     printf("Chat end!\n");
    54                     break;
    55                 }
    56             }
    57             //printf receive information
    58             sprintf(tempBuf,"%s: %s",inet_ntoa(addrClient.sin_addr),recvBuf);
    59             printf("%s\nserver:",tempBuf);
    60             //get input message
    61             gets(sendBuf);
    62             sendto(sockSrv,sendBuf,strlen(sendBuf)+1,0,(SOCKADDR*)&addrClient,len);
    63         }
    64     }
    65     else
    66     {
    67         printf("Server failed start.\n");
    68     }
    69     //close socket
    70     closesocket(sockSrv);
    71     WSACleanup();
    72 }
  2. 客户端代码:

     1 #include<Winsock2.h>
     2 #include<stdio.h>
     3
     4 void main()
     5 {
     6     //load socket libariy
     7     WORD wVersionRequested;
     8     //this struct use to stored Windows Sockets value after call WSAStartup() function,
     9     //include the data from Winscok.dll
    10     WSADATA wsaData;
    11     int err;
    12     wVersionRequested=MAKEWORD(1,1);
    13     err = WSAStartup(wVersionRequested,&wsaData);
    14     if(err!=0)
    15     {
    16         return;
    17     }
    18     if(LOBYTE(wsaData.wVersion)!=1 || (HIBYTE(wsaData.wVersion)!=1))
    19     {
    20         WSACleanup();
    21         return;
    22     }
    23     //create socket--- Protocol udp
    24     SOCKET sockClient=socket(AF_INET,SOCK_DGRAM,0);
    25     printf("Client create....OK!\n");
    26     //define variable for server address information struct
    27     SOCKADDR_IN addrSrv;
    28     addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
    29     addrSrv.sin_family=AF_INET;
    30     addrSrv.sin_port=htons(6000);
    31     //data buffer
    32     char recvBuf[100];
    33     char sendBuf[100];
    34     char tempBuf[200];
    35     int len=sizeof(SOCKADDR);
    36     //endless
    37     while(1)
    38     {
    39         printf("Client: ");
    40         gets(sendBuf);
    41         sendto(sockClient,sendBuf,strlen(sendBuf)+1,0,(SOCKADDR*)&addrSrv,len);
    42         //wait response from server
    43         recvfrom(sockClient,recvBuf,100,0,(SOCKADDR*)&addrSrv,&len);
    44         if(strlen(recvBuf)==1)
    45         {
    46             if(recvBuf[0]==‘q‘)
    47             {
    48                 printf("chat end.\n");
    49                 break;
    50             }
    51         }
    52         sprintf(tempBuf,"%s: %s",inet_ntoa(addrSrv.sin_addr),recvBuf);
    53         printf("%s\n",tempBuf);
    54     }
    55     closesocket(sockClient);
    56     WSACleanup();
    57 }
  3. 程序的开头,都是需要加载套接字库。因为通信是基于UDP协议的,所以加载数据报类型的套接字(SOCK_DGRAM)。之后需要定义一个地址类型(SOCKADDR_IN)变量,用来接收返回的套接字参数。
  4. 编译运行:

End.

谢谢.

原文地址:https://www.cnblogs.com/lumao1122-Milolu/p/11791023.html

时间: 2024-08-17 23:41:37

网络编程socket套接字及其使用(六)的相关文章

网络编程--Socket(套接字)

网络编程 网络编程的目的就是指直接或间接地通过网络协议与其他计算机进行通讯.网络编程中 有两个主要的问题,一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后 如何可靠高效的进行数据传输.在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的 路由,由IP地址可以唯一地确定Internet上的一台主机.而TCP层则提供面向应用的可靠的 或非可靠的数据传输机制,这是网络编程的主要对象,一般不需要关心IP层是如何处理数据 的. 目前较为流行的网络编程模型是客户机/服务器(C/S)结构

Visual C++网络编程--Socket套接字编程

套接字:一种在网络中不同主机之间进行数据交换的通信桥梁,人们所使用的网络通信软件功能均是基于Socket套接字作为通信桥梁实现. 寻址方式:在Winsock中,用户可以使用TCP/IP地址家族中统一的套接字地址结构解决TCP/IP寻址中可能出现的问题,定义如下 1 struct sockaddr_in{ 2 short sin_family; //指定地址家族即地址格式 3 unsigned short sin_port; //端口号码 4 struct in_addr sin_addr; //

19、网络编程 (Socket套接字编程)

网络模型 *A:网络模型 TCP/IP协议中的四层分别是应用层.传输层.网络层和链路层,每层分别负责不同的通信功能,接下来针对这四层进行详细地讲解. 链路层:链路层是用于定义物理传输通道,通常是对某些网络连接设备的驱动协议,例如针对光纤.网线提供的驱动. 网络层:网络层是整个TCP/IP协议的核心,它主要用于将传输的数据进行分组,将分组数据发送到目标计算机或者网络. 传输层:主要使网络程序进行通信,在进行网络通信时,可以采用TCP协议,也可以采用UDP协议. 应用层:主要负责应用程序的协议,例如

网络编程socket套接字及其使用(一)

socket作为网络上最常用的API之一,socket接口定义了许多的函数.socket套接字是网络通信的基本构件. WSAStartup 启动winsocket. getaddrinfo 获取地址信息 socket 创建socket bind 配置TCP监听socket listen 启动监听 WSAAsyncSelect 请求Windows Sockets DLL为窗口句柄发一条消息 OnSocket 事件处理 以上为基本流程. 原文地址:https://www.cnblogs.com/lu

MFC_网络编程socket套接字

MFC socket编程 MFC socket编程 ---- 一. 客户端 ---- 1. 创建一个Dialog Based项目:CSockClient. ---- 2. 设计对话框 ---- 去掉Ok和Cancle两个按钮,增加ID_Connect(连接).ID_Send(发送).ID_Exit(关闭)按钮,增加ListBox控件IDC_LISTMSG和Edit控件IDC_EDITMSG,并按下表在ClassWizard中为CCSockClientDlg类添加变量. Control ID Ty

Python网络编程—socket套接字编程(UDP)

套接字介绍 1.套接字 : 实现网络编程进行数据传输的一种技术手段 2.Python实现套接字编程:import socket 3.套接字分类 流式套接字(SOCK_STREAM): 以字节流方式传输数据,实现tcp网络传输方案.(面向连接--tcp协议--可靠的--流式套接字) 数据报套接字(SOCK_DGRAM):以数据报形式传输数据,实现udp网络传输方案.(无连接--udp协议--不可靠--数据报套接字) UDP套接字编程 服务端流程 1.创建数据报套接字 sockfd = socket

Python网络编程—socket套接字编程(TCP)

套接字介绍 1.套接字 : 实现网络编程进行数据传输的一种技术手段 2.Python实现套接字编程:import socket 3.套接字分类 流式套接字(SOCK_STREAM): 以字节流方式传输数据,实现tcp网络传输方案.(面向连接--tcp协议--可靠的--流式套接字) 数据报套接字(SOCK_DGRAM):以数据报形式传输数据,实现udp网络传输方案.(无连接--udp协议--不可靠--数据报套接字) tcp套接字 服务端流程 1.创建套接字 sockfd=socket.socket

网络编程 socket套接字

一.套接字了解 socket层: 那么多脏活累活我们不想干就全部交给socket来做,它是一组接口,把复杂的TCP/IP协议族隐藏在Socket接口后面 其实站在你的角度上看,socket就是一个模块.我们通过调用模块中已经实现的方法建立两个进程之间的连接和通信. 基于网络的套接字家族: 所有地址家族中,AF_INET是使用最广泛的一个,python支持很多种地址家族,但是由于我们只关心网络编程,所以大部分时候我们只使用AF_INET 二.套接字(socket)初使用 1.基于TCP协议的soc

VC网络编程 Socket套接字编程

基于TCP的Socket编程 TCP服务器: #include<winsock2.h> //包含头文件 #include<stdio.h> #include<windows.h> #pragma comment(lib,"WS2_32.lib") //显式连接套接字库 int main() //主函数开始 { WSADATA data; //定义WSADATA结构体对象 WORD w=MAKEWORD(2,0); //定义版本号码 char szte