udp demo

1、udp client

1.1 udp_client.h

#ifndef UDPDEMO_UDP_CLIENT_H
#define UDPDEMO_UDP_CLIENT_H
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <string.h>
#include <signal.h>
#include <fcntl.h>

class UdpClient
{
public:
    UdpClient(){};

    static void hand(int val);
    void startClient(int argc, char* argv[]);

private:
    static int clientSocket;
};


#endif //UDPDEMO_UDP_CLIENT_H

1.2 udp_client.cpp

#include "udp_client.h"

int UdpClient::clientSocket = -1;

void UdpClient::hand(int val)
{
    //5 close server
    close(clientSocket);
    printf("bye! \n");
    exit(0);

}


void UdpClient::startClient(int argc, char **argv)
{
    if(argc != 4) printf("please write ip adress and port!\n"), exit(0);
    printf("ip= %s         port = %d\n", argv[1], atoi(argv[2]));

    signal(SIGINT, hand);

    //1 create socket 参数 1:协议类型(版本) 2,通信媒介 3,保护方式
    clientSocket = socket(AF_INET, SOCK_DGRAM, 0);
    if(-1 == clientSocket) printf("create socket error:%m\n"), exit(-1);
    printf("create socket sucess !\n");

    //2 create server agreement adresses
    struct sockaddr_in cAddr = {0};
    cAddr.sin_family = AF_INET;
    cAddr.sin_addr.s_addr = inet_addr(argv[1]);
    cAddr.sin_port = htons(atoi(argv[2]));


    //3 communication
    char buff[256];
    char temp[256];
    int r;
    socklen_t len = sizeof(cAddr);

    while (1)
    {
        // send message
        printf("what do you want to send: ");
        scanf("%s",buff);
        sendto(clientSocket, buff, strlen(buff),0, (struct sockaddr*)&cAddr,sizeof cAddr);

        //recive message
        r = recvfrom(clientSocket, temp, 255, 0, (struct sockaddr*)&cAddr, &len);
        if(r > 0)
        {
            temp[r] = 0;
            printf("server send message>> %s\n", temp);
        }
    }
}

2.udp server

2.1 udp_server.h

#ifndef UDPDEMO_UDP_SERVER_H
#define UDPDEMO_UDP_SERVER_H
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <string.h>
#include <signal.h>
#include <fcntl.h>

class UdpServer
{
public:
    UdpServer(){};

    static void hand(int val);
    void startServer(int argc, char* argv[]);

private:
    static int serverSocket;

};


#endif //UDPDEMO_UDP_SERVER_H

2.2 udp_server.cpp

#include "udp_server.h"

int UdpServer::serverSocket = -1;
void UdpServer::hand(int val)
{
    //5 close server
    close(serverSocket);
    printf("bye! \n");
    exit(0);

}


void UdpServer::startServer(int argc, char* argv[])
{
    if(argc != 4) printf("please write ip adress and port!\n"), exit(0);
    printf("ip= %s         port = %d\n", argv[1], atoi(argv[2]));

    signal(SIGINT, hand);

    //1 create socket 参数 1:协议类型(版本) 2,通信媒介 3,保护方式
    serverSocket = socket(AF_INET, SOCK_DGRAM, 0);
    if(-1 == serverSocket) printf("create socket error:%m\n"), exit(-1);
    printf("create socket sucess !\n");

    //2 create server agreement adresses
    struct sockaddr_in sAddr = {0};
    sAddr.sin_family = AF_INET;
    sAddr.sin_addr.s_addr = inet_addr(argv[1]);
    sAddr.sin_port = htons(atoi(argv[2]));

    //3 binding
    int r = bind(serverSocket, (struct sockaddr*)&sAddr, sizeof sAddr);
    if(-1 == r) printf("binding is faile :%m ]\n"), close(serverSocket), exit(-2);
    printf("binding is sucess! \n");

    //4 communication
    char buff[256];
    struct sockaddr_in cAddr = {0};
    socklen_t len = sizeof(cAddr);

    while (1)
    {
        //如果还需要向客户端发送东西用recvfrom
        //upd精髓, 向一个协议地址簇发东西
        r = recvfrom(serverSocket, buff, 255, 0, (struct sockaddr*)&cAddr,&len);
        if(r > 0)
        {
            buff[r] = 0; //添加字符串结束符号
            printf(">>%s\n", buff);
        }
        printf("what do you want to say to client:  ");
        memset(buff, 256, 0);
        scanf("%s", buff);
        sendto(serverSocket, buff, strlen(buff),0, (struct sockaddr*)&cAddr,sizeof cAddr);
    }
}

3.main

#include "udp_client.h"
#include "udp_server.h"


int main(int argc, char *argv[])
{
    printf("%d\n", argc);
    if (argc == 4)
    {
        printf("%s\n", argv[3]);
        if (0 == atoi(argv[3])) // server
        {
            UdpServer server;
            server.startServer(argc, argv);
        }
        else if (1 == atoi(argv[3])) // client
        {
            UdpClient client;
            client.startClient(argc, argv);
        }
    }
    else
        std::cout << "please write right param!" << std::endl;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值