udt4编译静态库与使用实践

编译过程

1. 到 https://sourceforge.net/projects/udt/files/udt/ 这里下载源码
2. 进入udt4/win目录,打开udt.sln解决方案,如果用的是高版本的visual studio,则会自动升级解决方案
3. 修改udt项目属性,将配置类型设置为.lib
4. 修改udt项目属性,C/C++ -> 代码生成 -> 运行库,Debug版本设为MTd,Release版设为MT
5. 修改udt.h文件,修改以下五行,因为我们不需要编译dll

#ifdef UDT_EXPORTS
    #define UDT_API __declspec(dllexport)
#else
    #define UDT_API __declspec(dllimport)
#endif

改成

#ifdef UDT_EXPORTS
    #define UDT_API
#else
    #define UDT_API
#endif

6. 分别生成两次udt项目(Debug版和Release版),并将输出的udt.lib手动重命名为udt_debug.lib和udt_release.lib
7. 复制udt4/src下的udt.h、udt_debug.lib和udt_release.lib三个文件到自己的项目中
8. 完成

测试代码

服务端代码

#include <winsock2.h>
#include <ws2tcpip.h>

#include "udt.h"

using namespace std;

int main(int argc, char* argv[])
{
    /* 初始化 */
    UDT::startup();
    
    /* 创建Socket */
    UDTSOCKET local_socket = UDT::socket(AF_INET, SOCK_STREAM, 0);
    bool block = true;
    UDT::setsockopt(local_socket, 0, UDT_RCVSYN, &block, sizeof(bool));//阻塞接收
    UDT::setsockopt(local_socket, 0, UDT_SNDSYN, &block, sizeof(bool));//阻塞发送

    /* 接受连接 */
    char port[16];
    addrinfo hints, *local_addr;
    memset(&hints, 0, sizeof(struct addrinfo));
    hints.ai_flags = AI_PASSIVE;
    hints.ai_family = AF_INET;
    hints.ai_socktype = SOCK_STREAM;
    sprintf(port, "%d", 9000);//端口
    getaddrinfo("0.0.0.0", port, &hints, &local_addr);
    UDT::bind(local_socket, local_addr->ai_addr, local_addr->ai_addrlen);//绑定地址
    freeaddrinfo(local_addr);
    UDT::listen(local_socket, 1024);
    sockaddr_storage remote_addr;
    int addrlen = sizeof(remote_addr);
    UDTSOCKET remote_socket = UDT::accept(local_socket, (sockaddr*)&remote_addr, &addrlen);

    /* 收发缓冲区 */
    char buff[512];

    UDT::recv(remote_socket, buff, sizeof(buff), 0);
    printf("%s\n", buff);

    sprintf(buff, "Hello");
    UDT::send(remote_socket, buff, sizeof("Hello"), 0);

    /* 关闭连接 */
    UDT::close(remote_socket);
    UDT::close(local_socket);
    
    /* 清理资源 */
    UDT::cleanup();
    
    system("pause");
    return 0;
}

客户端代码

#include <winsock2.h>
#include <ws2tcpip.h>

#include "udt.h"

using namespace std;

int main(int argc, char* argv[])
{
    /* 初始化 */
    UDT::startup();
    
    /* 创建Socket */
    UDTSOCKET remote_socket = UDT::socket(AF_INET, SOCK_STREAM, 0);
    bool block = true;
    UDT::setsockopt(remote_socket, 0, UDT_RCVSYN, &block, sizeof(bool));//阻塞接收
    UDT::setsockopt(remote_socket, 0, UDT_SNDSYN, &block, sizeof(bool));//阻塞发送

    /* 连接服务器 */
    char port[16];
    addrinfo hints, *remote_addr;
    memset(&hints, 0, sizeof(struct addrinfo));
    hints.ai_family = AF_INET;
    hints.ai_socktype = SOCK_STREAM;
    sprintf(port, "%d", 9000);
    getaddrinfo("127.0.0.1", port, &hints, &remote_addr);
    UDT::connect(remote_socket, remote_addr->ai_addr, remote_addr->ai_addrlen);
    freeaddrinfo(remote_addr);

    /* 收发缓冲区 */
    char buff[512];
    
    sprintf(buff, "Hello");
    UDT::send(remote_socket, buff, sizeof("Hello"), 0);

    UDT::recv(remote_socket, buff, sizeof(buff), 0);
    printf("%s\n", buff);

    /* 关闭套接字 */
    UDT::close(remote_socket);
    
    /* 清理资源 */
    UDT::cleanup();
    
    system("pause");
    return 0;
}

需注意的是我们自己新建的项目也需要执行之前的步骤:
C/C++ -> 代码生成 -> 运行库,Debug版本设为MTd,Release版设为MT
另外还有别忘了在附件依赖项里加入udt_x.lib和ws2_32.lib两个文件

参考

https://blog.csdn.net/chinafe/article/details/8509994
http://aes.jypc.org/?p=31384

发表评论

电子邮件地址不会被公开。 必填项已用*标注