Winsock网络编程笔记(3)----基于UDP的server和client

在上一篇随笔中,对Winsock中基于tcp面向连接的Server和Client通信进行了说明,但是,Winsock中,Server和Client间还可以通过无连接通信,也就是采用UDP协议。。

因此,这一篇随笔也简单的列举基于UDP的Server和Client的实现。。

和基于TCP的实现相比,其主要的不同点包括:

①接收端(简单地说就是服务器)/发送端(简单地说就是客户端)在创建Socket时候,参数要选择SOCK_DGRAM, IPPROTO_UDP;

②接收端不需要调用listen和accept函数,而是通过recvfrom/WSArecvfrom函数接收数据报;

③发送端通过sendto/WSAsendto接收数据报;

接收端和发送端的代码如下:

 1 #include"winsock2.h"
 2 #include<iostream>
 3 using namespace std;
 4 //This line is very important
 5
 6 #pragma comment(lib,"ws2_32.lib")
 7 int main()
 8 {
 9     WSADATA              wsaData;
10     SOCKET               ReceivingSocket;
11     SOCKADDR_IN          ReceiverAddr;
12     int                  Port = 5150;
13     char                 ReceiveBuf[1024];
14     int                  BufLength = 1024;
15     SOCKADDR_IN          SenderAddr;
16     int                  SenderAddrSize = sizeof(SenderAddr);
17     int                  Ret;
18
19     if ((Ret = WSAStartup(MAKEWORD(2,2), &wsaData)) != 0)
20     {
21         cout<<"WSAStartup failed with error "<<Ret<<endl;
22         //here no WSACleanup,because we do not create anything;
23         return -1;
24     }
25
26     // Create a new socket to listening for client connections.
27     //Note the difference with TCP
28     ReceivingSocket = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
29     if ( INVALID_SOCKET == ReceivingSocket)
30     {
31         cout<<"Socket failed with error "<<WSAGetLastError()<<endl;
32         WSACleanup();
33         return -1;
34     }
35
36     ReceiverAddr.sin_family = AF_INET;
37     ReceiverAddr.sin_addr.s_addr = htonl(INADDR_ANY);
38     ReceiverAddr.sin_port = htons(Port);
39
40     //to bind
41     if (bind(ReceivingSocket, (SOCKADDR *)&ReceiverAddr, sizeof(ReceiverAddr)) == SOCKET_ERROR)
42     {
43         cout<<"Binding failed with error "<<WSAGetLastError()<<endl;
44         closesocket(ReceivingSocket);
45         WSACleanup();
46         return -1;
47     }
48
49     // Listen for client connections. We used a backlog of 5 which is
50     // normal for many applications.
51
52     cout<<"** We are ready to receive 1 datagram from any interface on port "<<Port<<"**"<<endl;
53
54     //accep a connection when one arrives
55
56
57
58     cout<<"** We are waiting for data...**\n";
59     //SenderAddrSize = sizeof(SenderAddr);
60     Ret = recvfrom(ReceivingSocket,ReceiveBuf,BufLength,0,(SOCKADDR *)&SenderAddr,&SenderAddrSize);
61     if (SOCKET_ERROR == Ret)
62     {
63         cout<<"Recvfrom failed with error "<<WSAGetLastError()<<endl;
64         closesocket(ReceivingSocket);
65         WSACleanup();
66         return -1;
67     }
68     cout<<"**We have successfully recieve "<<Ret<<" Byte(s) data!**\n";
69
70     cout<<"**We are going to close the client connection...**\n";
71
72     closesocket(ReceivingSocket);
73     WSACleanup();
74
75     return 0;
76 }

Receiver Code

 1 #include"winsock2.h"
 2 #include<iostream>
 3  #include <time.h>
 4 using namespace std;
 5 //This line is very important
 6
 7 #pragma comment(lib,"ws2_32.lib")
 8 int main(int argc, char **argv)
 9 {
10     WSADATA              wsaData;
11     SOCKET               SendingSocket;
12     SOCKADDR_IN          ReceiverAddr;
13     int                  Port = 5150;
14     int                  Ret;
15
16     if (argc <= 1)
17     {
18         cout<<"USAGE: udpclient <Server IP address>.\n";
19         return -1;
20     }
21
22     // Initialize Winsock version 2.2
23
24     if ((Ret = WSAStartup(MAKEWORD(2,2), &wsaData)) != 0)
25     {
26         cout<<"WSAStartup failed with error "<<Ret<<endl;
27         return -1;
28     }
29
30     // Create a new socket to make a client connection.
31
32     SendingSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);//Note the difference with TCP
33     if (INVALID_SOCKET == SendingSocket)
34     {
35         cout << "socket failed with error " << WSAGetLastError()<<endl;
36         WSACleanup();
37         return -1;
38     }
39
40     ReceiverAddr.sin_family = AF_INET;
41     ReceiverAddr.sin_port = htons(Port);
42     ReceiverAddr.sin_addr.s_addr = inet_addr(argv[1]);
43
44     // Make a connection to the server with socket s.
45
46     cout<< "We are trying to connect to " << inet_ntoa(ReceiverAddr.sin_addr)
47         << ":" << htons(ReceiverAddr.sin_port) << "...\n";
48
49     cout << "We will now try to send a hello message.\n";
50
51     if ((Ret = sendto(SendingSocket, "Hello", 5, 0, (SOCKADDR *)&ReceiverAddr,sizeof(ReceiverAddr))) == SOCKET_ERROR)
52     {
53         cout << "Sendto failed with error " << WSAGetLastError()<<endl;
54         closesocket(SendingSocket);
55         WSACleanup();
56         return -1;
57     }
58
59     cout << "We successfully sent " << Ret << " byte(s).\n";
60
61     // When you are finished sending and receiving data on socket s,
62     // you should close the socket.
63
64     cout << "We are closing the connection.\n";
65
66     closesocket(SendingSocket);
67
68     // When your application is finished handling the connection, call
69     // WSACleanup.
70
71     WSACleanup();
72     return 0;
73 }

Sender Code

Winsock网络编程笔记(3)----基于UDP的server和client

时间: 2024-08-06 03:41:06

Winsock网络编程笔记(3)----基于UDP的server和client的相关文章

Winsock网络编程笔记(4)----基本的理论知识

前面的笔记记录了Winsock的入门编程,领略了Winsock编程的乐趣..但这并不能算是掌握了Winsock,加深理论知识的理解才会让后续学习更加得心应手..因此,这篇笔记将记录一些有关Winsock的基本理论知识,由于是一篇笔记,鉴于看书速度有限,主要内容会慢慢地填入..错误在所难免的,希望看客更正..(*^__^*) 嘻嘻…… Winsock网络编程笔记(4)----基本的理论知识,布布扣,bubuko.com

Winsock 网络编程笔记(1)----入门

今天第一次接触winsock网络编程,看的资料是Windows网络编程第二版.通过博客记住自己的看书笔记.. 在这里贴出第一个程序,虽然程序什么都没做,但以此作为入门,熟悉其网络编程风格.. 1 #include"winsock2.h" 2 #include<iostream> 3 using namespace std; 4 //This line is very important 5 6 #pragma comment(lib,"ws2_32.lib&quo

网络编程[第二篇]基于udp协议的套接字编程

udp协议下的套接字编程 一.udp是无链接的    不可靠的 而上篇的tcp协议是可靠的,会有反馈信息来确认信息交换的完成与否 基于udp协议写成的服务端与客户端,各司其职,不管对方是否接收到信息,只需自己发送了即可 二.客户端 import socket #买手机 -- 套接字家族 | 端口协议 phone = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) #服务端地址 ip_port = ('127.0.0.1',8001) #实现多次发送

C/C++网络编程6——实现基于UDP的服务器端/客户端

前面介绍了基于TCP实现的服务器端和客户端,本节介绍基于UDP实现的服务器端和客户端.UDP协议提供的无连接的,不可靠的传输服务,在一些要求传输速度,可以接受丢包的传输场景应用广泛,比如视频音频传输场景.UDP中只有创建套接字的过程和数据交换的过程. #include <sys/socket.h> sszie_t sendto(int sock, void *buff, size_t nbytes, int flags, struct sockaddr *to, socklen_t addrl

Java基础知识强化之网络编程笔记04:UDP之发送端的数据来自于键盘录入案例

1. 数据来自于键盘录入 键盘录入数据要自己控制录入结束. 2. 代码实现: (1)发送端: 1 package com.himi.updDemo1; 2 3 import java.io.IOException; 4 import java.net.DatagramPacket; 5 import java.net.DatagramSocket; 6 import java.net.InetAddress; 7 import java.util.Scanner; 8 9 /** 10 * 11

Java基础知识强化之网络编程笔记03:UDP之UDP协议发送数据 和 接收数据

1. UDP协议发送数据 和 接收数据 UDP协议发送数据: • 创建发送端的Socket对象 • 创建数据,并把数据打包 • 调用Socket对象的发送方法,发送数据包 • 释放资源  UDP协议接收数据:       • 创建接收端的Socket对象      • 创建数据包,接收数据(接收容器)      • 调用Socket对象的接收方法,接收数据包      • 解析数据包,并显示在控制台      • 释放资源 2. 代码实现 (1)首先我们先写发送端的程序,如下: 1 packag

linux网络编程笔记——UDP

目前这部分代码会出现阻塞问题,暂时尚未解决 #include "udp.h" #include <stdio.h> #include <string.h> #include <stdlib.h> #include <unistd.h> #include <errno.h> #include <malloc.h> #include <sys/types.h> #include <sys/socket

linux网络编程笔记——TCP

1.TCP和UDP TCP是长连接像持续的打电话,UDP是短消息更像是发短信.TCP需要消耗相对较多的资源,但是传输质量有保障,UDP本身是不会考虑传输质量的问题. 2.网络传输内容 我习惯的做法是直接通过TCP传送结构体,当然前提是收发两端都在程序里对目标结构体有充分的定义.特别说明的一点是,要小心收发两端处理器的大小端问题!而且传输信息头里必须包含长度信息,而且通用的是大端.但是,这里的长度和结构体,我选择用小端进行传输. 3.TCPserver实现 参考了别人多线程的回调写法,看起来不错.

嵌入式 Linux网络编程(三)——UDP编程模型

嵌入式 Linux网络编程(三)--UDP编程模型 UDP编程模型: UDP循环服务器模型为: socket(...); bind(...); while(1) {    recvfrom(...);    process(...);    sendto(...); } server.c代码: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #inc