VC++ UDP网络控制台程序

 采用的是VC2008,控制台应用程序,使用UDP编写。

1、服务端代码

//UDPServer.cpp

#include <WinSock2.h>
#include <stdio.h>  

#define SERVERPORT 6000 //服务端口号  

#pragma comment(lib, "WS2_32.lib")

int main(int argc, char *argv[])
{
    //加载套接字库
    WORD wVersionRequested;
    WSADATA wsaData;
    int err;  

    wVersionRequested = MAKEWORD( 2, 2 );  

    err = WSAStartup( wVersionRequested, &wsaData );
    if ( err != 0 ) {
        /* Tell the user that we could not find a usable */
        /* WinSock DLL.                                  */
        return -1;
    }  

    /* Confirm that the WinSock DLL supports 2.2.*/
    /* Note that if the DLL supports versions greater    */
    /* than 2.2 in addition to 2.2, it will still return */
    /* 2.2 in wVersion since that is the version we      */
    /* requested.                                        */  

    if ( LOBYTE( wsaData.wVersion ) != 2 ||
        HIBYTE( wsaData.wVersion ) != 2 ) {
            /* Tell the user that we could not find a usable */
            /* WinSock DLL.                                  */
            WSACleanup( );
            return -1;
    }  

    /* The WinSock DLL is acceptable. Proceed. */
    //创建套接字
    SOCKET sockServer = socket(AF_INET, SOCK_DGRAM, 0);
    if (INVALID_SOCKET == sockServer)
    {
        printf("socket() called failed! The error code is: %d\n", WSAGetLastError());
        return -1;
    }
    else
    {
        printf("socket() called succesful!\n");
    }  

    //服务器端
    SOCKADDR_IN addrServer;
    addrServer.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
    addrServer.sin_family = AF_INET;
    addrServer.sin_port = htons(SERVERPORT);  

    //绑定套接字
    err = bind(sockServer, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
    if (SOCKET_ERROR == err)
    {
        printf("bind() called failed! The error code is: %d\n", WSAGetLastError());
        return -1;
    }
    else
    {
        printf("bind() called successful!\n");
    }  

    //等待并接收数据
    SOCKADDR_IN addrClient;//用于接收发送端的地址信息
    int len = sizeof(SOCKADDR);
    char recvBuf[100];
    recvfrom(sockServer, recvBuf, 100, 0, (SOCKADDR*)&addrClient, &len);
    //打印接收到的数据
    printf("receive data:%s from client [%s,%d]", recvBuf, inet_ntoa(addrClient.sin_addr), addrClient.sin_port);  

    //关闭套接字
    closesocket(sockServer);  

    //终止套接字库的使用
    WSACleanup();  

    return 0;
}  

2、客户端代码

//UDPClient.cpp

#include <WinSock2.h>
#include <stdio.h>  

#define SERVERPORT 6000 //服务端口号  

#pragma comment(lib, "WS2_32.lib") 

int main(int argc, char *argv[])
{
    //加载套接字库
    WORD wVersionRequested;
    WSADATA wsaData;
    int err;  

    wVersionRequested = MAKEWORD( 2, 2 );  

    err = WSAStartup( wVersionRequested, &wsaData );
    if ( err != 0 ) {
        /* Tell the user that we could not find a usable */
        /* WinSock DLL.                                  */
        return -1;
    }  

    /* Confirm that the WinSock DLL supports 2.2.*/
    /* Note that if the DLL supports versions greater    */
    /* than 2.2 in addition to 2.2, it will still return */
    /* 2.2 in wVersion since that is the version we      */
    /* requested.                                        */  

    if ( LOBYTE( wsaData.wVersion ) != 2 ||
        HIBYTE( wsaData.wVersion ) != 2 ) {
            /* Tell the user that we could not find a usable */
            /* WinSock DLL.                                  */
            WSACleanup( );
            return -1;
    }  

    //创建套接字
    SOCKET sockClient = socket(AF_INET, SOCK_DGRAM, 0);
    if (INVALID_SOCKET == sockClient)
    {
        printf("socket() called failed! The error code is: %d\n", WSAGetLastError());
        return -1;
    }
    else
    {
        printf("socket() called succesful!\n");
    }  

    SOCKADDR_IN addrServer;
    addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
    addrServer.sin_family = AF_INET;
    addrServer.sin_port = htons(SERVERPORT);  

    //发送数据
    err = sendto(sockClient, "Hello", strlen("Hello")+1, 0, (SOCKADDR*)&addrServer, sizeof(SOCKADDR));
    if (SOCKET_ERROR == err)
    {
        printf("sendto() called failed! The error code is: %s\n", WSAGetLastError());
        return -1;
    }
    else
    {
        printf("sendto() called successful!\n");
    }  

    //关闭套接字
    closesocket(sockClient);  

    //终止套接字库的使用
    WSACleanup();  

    return 0;
} 

注意:上面两部分代码中的

#pragma comment(lib, "WS2_32.lib")
可以删除,而改为设置程序属性,具体如下步骤:

 server 和 client 都要"项目属性"--->"配置属性"----> "链接"----> "输入" --->"附加依赖项"中添加"ws2_32.lib"。

先启动服务端UDPServer程序,再启动客户端UDPClient程序,运行结果如下:

服务端UDPServer

客户端UDPClient

此时服务端UDPServer的结果会发生变化,会受到客户端发送过来的数据,如下图所示:

参考资料:

1、《VC++深入详解》 第14章网络编程 ,孙鑫主编

2、MSDN帮助文档

原文链接:VC++ UDP网络控制台程序

时间: 2024-12-15 09:26:30

VC++ UDP网络控制台程序的相关文章

VC++ TCP网络控制台程序

在Windows7系统下,采用工具为VS2008,Win32控制台应用程序,编写一个基于TCP的Client/Server网络程序. 1.服务器端代码 #include <WinSock2.h> #include <stdio.h> //VS2012创建的MFC Win32控制台应用程序中,此处默认包含的是#include "stdafx.h",其中stdio.h头文件已经被包含进stdafx.h中了,不再需要重复包含 #define SERVERPORT 60

UDP网络程序实例

根据前面所讲的网络编程的基础知识,以及UDP网络编程的特点,下面创建一个广播数据报程序.广播数据报是一种较新的技术,类似于电台广播,广播电台需要在指定的波段和频率上广播信息,收听者也要将收音机调到指定的波段.频率才可以收听广播内容.本实例要求主机不断地重复播出节目预报,这样可以保证加入到同一组的主机随时接收到广播信息.接收者将正在接收的信息放在一个文本框中,并将接收的全部信息放在另一个文本框中.(1)创建广播主机项目Server(控制台应用程序),在Main方法中创建UDP连接:然后通过UDP连

TCP 、UDP网络编程作业代写、代写C 语言 TCP程序 Network Programming using C

TCP .UDP网络编程作业代写.代写C 语言 TCP程序Network Programming using COverview? This homework is due by 11:59:59 PM on Thursday, April 26, 2018.? This homework will count as 8% of your final course grade.? This homework is to be completed individually. Do not shar

黑马程序员_JAVA UDP网络编程学习笔记

一.UDP网络编程概述 采用TCP协议通信时,客户端的Socket必须先与服务器建立连接,连接建立成功后,服务器端也会持有客户端连接的Socket,客户端的Socket与服务器端的Socket是对应的,它们构成了两个端点之间的虚拟通信链路.与TCP通信不同,UDP是面向无连接的.不可靠的基于数据包的传输协议.即应用进程(或程序)在使用UDP协议之前,不必先建立连接.自然,发送数据结束时也没有连接需要释放.因此,减少了开销和发送数据之前的延时.UDP也采用端口来区分进程. 在java中,java.

udp网络程序-发送、接收数据

1. udp网络程序-发送数据 创建一个基于udp的网络程序流程很简单,具体步骤如下: 创建客户端套接字 发送/接收数据 关闭套接字 代码如下: #coding=utf-8 from socket import * # 1. 创建udp套接字 udp_socket = socket(AF_INET, SOCK_DGRAM) # 2. 准备接收方的地址 # '192.168.1.103'表示目的ip地址 # 8080表示目的端口 dest_addr = ('192.168.1.103', 8080

python:UDP网络程序与总结

UDP网络程序 一.创建一个udp客户端程序 流程简单,具体步骤如下: 创建客户端套接字 发送/接收数据 关闭套接字 二.发送数据 from socket import * #1. 创建套接字 udpSocket = socket(AF_INET, SOCK_DGRAM) #2. 准备接收方的地址 sendAddr = ('192.168.1.103', 8080) #3. 从键盘获取数据 sendData = input("请输入要发送的数据:") #4. 发送数据到指定的电脑上 u

C、C++控制台程序、Windows API程序、MFC程序理解与比较

在编程语言中,函数是一个很重要的概念,其身影无处不在.在面向过程的编程方式中,函数更是程序的基本构建模块,在面向对象的编程方式中,函数演变为类或对象的成员(当然也可以使用与类无关的函数).函数由函数头和函数体组成.函数头包括域属性(如external.static或类域).返回值类型.函数名.及参数.域属性包括其在多文件编程中的可见范围,是否是属于某一个类的成员?返回值类型是指函数返回的值的具体数据类型(可以理解为函数输出的一部分).函数名是函数保存在内存代码区的首地址,用于函数的调用及函数指针

UDP网络编程

IP地址和端口 IP地址:是计算机在网络中的唯一标示,我们在进行网络编程时一定要定位到远程计算机,而IP地址就是解决这个问题的. 端口:除了计算机外我们还要定位到具体的应用程序进程,而端口就是给应用程序分配的身份标示. UDP和TCP UDP:1,每个数据报中都给出了完整的地址信息,因此无需要建立发送方和接收方的连接.            2,UDP传输数据时是有大小限制的,每个被传输的数据报必须限定在64kB之内.             3,UDP是一个不可靠的协议,发送方所发送的数据报并

unix域套接字的UDP网络编程

unix域套接字的UDP网络编程,服务端如下: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <sys/types.h> #include <sys/un.h> #define SA struct sockaddr #define PATHNAME