码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2019-10-15 10:02:30      阅读:262      评论:0      收藏:0      [点我收藏+]

标签:memset   传输   bin   ESS   网络编程   网络   自动   byte   char   

  前面介绍了基于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 addrlen);

sock : 用于传输数据的UDP套接字的文件描述符
buff : 保存待传输数据的缓存区地址
nbytes : 待传输的数据长度,以字节为单位
flags : 可选参数项,若没有则传递0
to : 传到哪儿
addrlen : 地址长度 
#include <sys/socket.h>

sszie_t recvfrom(int sock, void *buff, size_t nbytes, int flags, struct sockaddr *from, socklen_t *addrlen);

sock : 用于接收数据的UDP套接字的文件描述符
buff : 保存接收数据的缓存区地址
nbytes : 可接收的最大字节数,以字节为单位
flags : 可选参数项,若没有则传递0
to : 从哪儿接收数据
addrlen : from结构体长度的变量地址值

  实现基于UDP的客户端和服务器端,客户端给服务器端传输数据,服务器端接收到数据以后将数据原封不动的传回客户端。

服务器端:

#include <iostream>
#include <unistd.h>
#include <cstdlib>
#include <cstdio>
#include <string.h>
#include <string>
#include <arpa/inet.h>
#include <sys/socket.h>

using namespace std;

const int BUFFER_SIZE = 100;

int main()
{
    int server_sock = socket(PF_INET, SOCK_DGRAM, 0);
    if (server_sock == -1) {
        cout << "socket() failed" << endl;
        return 0;
    }

    sockaddr_in server_addr;
    memset(&server_addr, 0, sizeof(server_addr));
    server_addr.sin_family = AF_INET;
    server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    server_addr.sin_port = htons(10000);
    if (bind(server_sock, (sockaddr *)&server_addr, sizeof(server_addr)) == -1) {
        cout << "bind() failed" << endl;
        close(server_sock);
        return 0;
    }

    for (int i = 0; i < 5; i++) {
        sockaddr_in client_addr;
        socklen_t client_addr_size = sizeof(client_addr);
        char message[BUFFER_SIZE];

        int str_len = recvfrom(server_sock, message, BUFFER_SIZE, 0, (sockaddr *)&client_addr, &client_addr_size);
        cout << message << endl;

        sendto(server_sock, message, str_len, 0, (sockaddr*)&client_addr, client_addr_size);
    }

    close(server_sock);
    return 0;
}

客户端:

#include <iostream>
#include <unistd.h>
#include <cstdlib>
#include <cstdio>
#include <string.h>
#include <string>
#include <arpa/inet.h>
#include <sys/socket.h>

using namespace std;

const int BUFFER_SIZE = 100;

int main()
{
    int client_sock = socket(PF_INET, SOCK_DGRAM, 0);
    if (client_sock == -1) {
        cout << "socket failed" << endl;
        return 0;
    }

    sockaddr_in server_addr;
    memset(&server_addr, 0, sizeof(server_addr));
    server_addr.sin_family = AF_INET;
    server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
    server_addr.sin_port = htons(10000);

    for (int i = 0; i < 5; i++) {
        cout << "input str : ";
        char message[BUFFER_SIZE];
        cin >> message;

        sendto(client_sock, message, strlen(message), 0, (sockaddr*)&server_addr, sizeof(server_addr));

        sockaddr_in from_addr;
        socklen_t addr_size = sizeof(from_addr);
        char recv_message[BUFFER_SIZE];
        int strlen = recvfrom(client_sock, recv_message, BUFFER_SIZE, 0, (sockaddr*)&from_addr, &addr_size);
        recv_message[strlen] = \0;
        cout << recv_message << endl;

    }

    close(client_sock);
    return 0;
}

  TCP客户端在调用connect函数的时候自动给客户端分配IP地址和端口号,UDP中第一次调用sendto函数时给客户端分配IP地址和端口号。

  

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

标签:memset   传输   bin   ESS   网络编程   网络   自动   byte   char   

原文地址:https://www.cnblogs.com/418ks/p/11675305.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!