首页 > 其他分享 >单机上的UDP客户端与服务器端

单机上的UDP客户端与服务器端

时间:2023-03-01 20:14:56浏览次数:34  
标签:UDP addr int port printf sizeof 客户端 sin 服务器端

服务端:

#include <stdio.h>
#include <stdlib.h>
#include <winsock2.h>
#pragma comment(lib, "ws2_32")

static SOCKET Udp;

int udp_init(char *ip, int port)
{
    struct sockaddr_in ser; //服务器端地址
    WSADATA wsaData;
    if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
    {
        printf("Failed to load Winsock.\n"); //Winsock 初始化错误
        return -1;
    }
    ser.sin_family = AF_INET;                       //初始化服务器地址信息
    ser.sin_port = htons(port);                     //端口转换为网络字节序
    ser.sin_addr.s_addr = inet_addr(ip);            //IP 地址转换为网络字节序 


    Udp = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); //创建UDP套接字
    if (Udp == INVALID_SOCKET)
    {
        printf("socket() Failed: %d\n", WSAGetLastError());
        return -1;
    }
    if (bind(Udp, (LPSOCKADDR)&ser, sizeof(ser)) == SOCKET_ERROR)
    {
        printf("绑定IP和端口\n");
        return 0;
    }
    printf("udp init ok\n");
}

int udp_send(char *ip, int port, unsigned char *buff, int len)
{
    struct sockaddr_in s;
    int ret, addrlen;

    s.sin_family = AF_INET;
    s.sin_port = htons(port);
    s.sin_addr.s_addr = inet_addr(ip);
    addrlen = sizeof(s);
    sendto(Udp, buff, len, 0, (SOCKADDR *)&s, addrlen);

    return 0;
}

int udp_rcv(char *ip, int *port, unsigned char *buff, int *len)
{
    struct sockaddr_in s;
    int ret, addrlen;

    addrlen = sizeof(s);
    ret = recvfrom(Udp, buff, 1024, 0, (SOCKADDR *)&s, &addrlen);
    if (ret > 0)
    {
        memcpy(ip, inet_ntoa(s.sin_addr), strlen(inet_ntoa(s.sin_addr)));//copy ip to from_ip
        *port = ntohs(s.sin_port);
        // printf("rcv ok\n");
    }
    *len = ret;

    return ret;
}

int close_udp()
{
    closesocket(Udp); //关闭 socket
    WSACleanup();
}

客户端:

//#include <stdio.h>
//#include <winsock2.h>
//
//#pragma comment(lib,"ws2_32.lib")
//
//
//int main(void)
//{
//    WORD sockVision = MAKEWORD(2, 2);
//    WSADATA wsadata;
//    
//    struct sockaddr_in SerAddr;
//    const char senddata[300] = {0}; 
//    UINT8 revdata[400];
//    int ret = -1;
//    int len = -1;
//    if (WSAStartup(sockVision, &wsadata) != 0)
//    {
//        printf("WSA初始化失败\n");
//        return 0;
//    } 
//
//
//    //创建套接字
//    SOCKET sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
//    if (sock == INVALID_SOCKET) 
//    {
//        printf("socket客户端创建失败\n");
//        return 0;
//    } 
//    //客户端设置服务器地址信息
//    SerAddr.sin_family = AF_INET;
//    SerAddr.sin_port = htons(10060);
//    SerAddr.sin_addr.S_un.S_addr = inet_addr("192.168.1.53"); //
//     
//
//
//    //获取数据发送给服务器
//    struct sockaddr  fromAddr;
//    int  addrLen = sizeof(fromAddr);
//
//    while (1)
//    {
//        memset(revdata, 0, sizeof(revdata));
//        //printf("设备:");
//        //scanf("%s", senddata); 
//        //sendto(sock, senddata, strlen(senddata), 0, (SOCKADDR*)&SerAddr, sizeof(SerAddr));
//        //if (strcmp(senddata, "bye") == 0)
//        //    break; 
//        //ret = recvfrom(sclient, revdata, sizeof(revdata), 0, (SOCKADDR*)&clientAddr, &len);
//        
//        ret = recvfrom(sock, revdata, sizeof(revdata), 0, (SOCKADDR*)&fromAddr, &addrLen);
//        revdata[sizeof(revdata)-1] = 0;
//        if (ret>0)
//            printf("服务器返回数据:%s\r\n",revdata);
//    } 
//    closesocket(sock);
//    WSACleanup(); 
//    system("pause");
//    return 0; 
//}




 #include <stdio.h>
#include <WinSock2.h>
#pragma comment(lib, "ws2_32.lib")  //加载 ws2_32.dll

#define BUF_SIZE 100

int main(){
    //初始化DLL
    WSADATA wsaData;
    WSAStartup(MAKEWORD(2, 2), &wsaData);

    //创建套接字
    SOCKET sock = socket(PF_INET, SOCK_DGRAM, 0);

    //服务器地址信息
    struct sockaddr_in servAddr;
    memset(&servAddr, 0, sizeof(servAddr));  //每个字节都用0填充
    servAddr.sin_family = PF_INET;
    servAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
    servAddr.sin_port = htons(1234);

    //不断获取用户输入并发送给服务器,然后接受服务器数据
    struct sockaddr fromAddr;
    int addrLen = sizeof(fromAddr);
    while(1){
        char buffer[BUF_SIZE] = {0};
        printf("Input a string: ");
        gets(buffer);
        sendto(sock, buffer, strlen(buffer), 0, (struct sockaddr*)&servAddr, sizeof(servAddr));
        int strLen = recvfrom(sock, buffer, BUF_SIZE, 0, &fromAddr, &addrLen);
        buffer[strLen] = 0;
        printf("Message form server: %s\n", buffer);
    }

    closesocket(sock);
    WSACleanup();
    return 0;
}

 

标签:UDP,addr,int,port,printf,sizeof,客户端,sin,服务器端
From: https://www.cnblogs.com/xwtstudio/p/17169507.html

相关文章

  • Redxu(RTK) 基础 异步逻辑与数据请求 第5.0节 简介REST API 和(HTTP)客户端示例
    额,上一篇好长,这篇我看也不短,对应文档这一节,所以我要把这一节分成几个小节,否则太累了。主要介绍thunk加载帖子加载用户数据添加新帖子等内容捏!简介在第四节:使用Re......
  • 快手 客户端测开 面经
    一面1.自我介绍2.讲一个项目3.履约系统的业务量是多大4.mq消息怎么测试的5.ssm是什么6.主要负责客户端还是服务端7.测试移动端,你的优缺点是什么8.验证新用户或新设......
  • Oracle 低版本客户端连接19C报错ORA-28040
    #适用范围12.2+#问题概述客户使用Oracle11.2客户端连接Oracle19c的时候,报错:ORA-28040:NomatchingauthenticationprotocolORA-28040:没有匹配的验证协议#问题原......
  • [收藏]实现支持断点续传多线程下载的 Http Web 客户端工具类 (第2版)
    实现支持断点续传多线程下载的HttpWeb客户端工具类(第2版)[日期:2005-03-21] 作者:Microshaoft[字体:大中小]/*.Net/C#:实现支持断点续传多线程下载的HttpWeb客......
  • Kafka 消费者客户端
    消费者客户端开发在了解了消费者与消费组之间的概念之后,我们就可以着手进行消费者客户端的开发了。在Kafka的历史中,消费者客户端同生产者客户端一样也经历了两个大版本:......
  • java网络编程-客户端和服务器
    基于java.net包,实现一个简单的服务端和客户端,客户端只管发,服务端只管收缺点:服务端只能处理一个客户端的请求,因为服务端是单线程的。一次只能与一个客户端进行消息通信服......
  • 命令行客户端
    一、命令行操作数据库1、操作数据库操作数据库之前要通过命令行工具连接到数据库: mysql-uroot-p123456(1)查看所有数据库:showdata......
  • vue的两种服务器端渲染方案
    作者:京东零售姜欣关于服务器端渲染方案,之前只接触了基于react的Next.js,最近业务开发vue用的比较多,所以调研了一下vue的服务器端渲染方案。首先:长文预警,下文包括了两种方案......
  • servlet响应一个随机四位验证码图片给客户端
    众所周知,在html中对于图片资源的加载,是通过访问其src的值进行一次请求。我们可以在Java中使用BufferedImage类创建一张图片,通过Graphics2D类进行图片的绘制,从而动态制作验......
  • vue的两种服务器端渲染方案
    作者:京东零售姜欣关于服务器端渲染方案,之前只接触了基于react的Next.js,最近业务开发vue用的比较多,所以调研了一下vue的服务器端渲染方案。首先:长文预警,下文包括了两种方......