您的位置:首页 > 理论基础 > 计算机网络

VC++ UDP网络控制台程序

2017-12-11 13:55 453 查看
原文:http://blog.csdn.net/ccf19881030/article/details/16991215

我在server里面分别添加了发送,在clent添加了接收的部分附在最后面.

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

1、服务端代码

//UDPServer.cpp

[cpp] view
plain copy

#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

[cpp] view
plain copy

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

}  

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

服务端UDPServer



客户端UDPClient



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



参考资料:

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

2、MSDN帮助文档
#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);

//发送数据
err = sendto(sockServer, "Hello Client", strlen("Hello Client")+1, 0, (SOCKADDR*)&addrClient, 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(sockServer);

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

return 0;
}


clent端:

#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 server", strlen("Hello server")+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");
}

int len = sizeof(SOCKADDR);
char recvBuf[100];
recvfrom(sockClient, recvBuf, 100, 0, (SOCKADDR*)&addrServer, &len);

//打印接收到的数据
printf("receive data:%s from client [%s,%d]", recvBuf, inet_ntoa(addrServer.sin_addr), addrServer.sin_port);

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

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

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: