簡單的UDP網路程式 實現乙個簡單的英譯漢功能

2021-09-12 08:24:20 字數 3437 閱讀 3654

實現乙個簡單的英譯漢的功能

備註:套接字的使用,在已經寫過

封裝udpsocket

udp_socket.hpp

#pragma once

#include #include #include #include #include #include #include #include #include typedef struct sockaddr sockaddr;

typedef struct sockaddr_in sockaddr_in;

class udpsocket

bool socket()

return true;

} bool close()

bool bind(const std::string& ip, uint16_t port)

return true;

} bool recvfrom(std::string* buf, std::string* ip = null, uint16_t* port = null)

; sockaddr_in peer;

socklen_t len = sizeof(peer);

ssize_t read_size = recvfrom(fd_, tmp, sizeof(tmp)-1, 0, (sockaddr*)&peer, &len);

if (read_size < 0)

// 將讀到的緩衝區內容放到輸出引數中

buf->assign(tmp, read_size);

if (ip != null)

if (port != null)

return true;

} bool sendto(const std::string& buf, const std::string& ip, uint16_t port)

return true;

}private:

int fd_;

};

udp通用伺服器

udp_server.hpp

#pragma once

#include "udp_socket.hpp"

// c 式寫法

// typedef void (*handler)(const std::string& req, std::string* resp);

// c++ 11 式寫法, 能夠相容函式指標, 仿函式, 和 lamda

#include typedef std::functionhandler;

class udpserver

~udpserver()

bool start(const std::string& ip, uint16_t port, handler handler)

// 3. 進入事件迴圈

for (;;)

std::string resp;

// 5. 根據請求計算響應

handler(req, &resp);

// 6. 返回響應給客戶端

sock_.sendto(resp, remote_ip, remote_port);

printf("[%s:%d] req: %s, resp: %s\n", remote_ip.c_str(), remote_port,

req.c_str(), resp.c_str());

}

sock_.close();

return true;

}private:

udpsocket sock_;

};

實現英譯漢伺服器

以上**是對udp伺服器進行通用介面的封裝,基於以上封裝,實現乙個查字典的伺服器就很容易了

dict_server.cc

#include "udp_server.hpp"

#include #include std::unordered_mapg_dict;

void translate(const std::string& req, std::string* resp)

*resp = it->second;

}int main(int argc, char* ar**)

// 1. 資料初始化

g_dict.insert(std::make_pair("hello", "你好"));

g_dict.insert(std::make_pair("world", "世界"));

g_dict.insert(std::make_pair("c++", "最好的程式語言"));

g_dict.insert(std::make_pair("ok", "好的"));

// 2. 啟動伺服器

udpserver server;

server.start(ar**[1], atoi(ar**[2]), translate);

return 0;

}

udp通用客戶端

udp_client.hpp

#pragma once 

#include "udp_socket.hpp"

class udpclient

~udpclient()

bool recvfrom(std::string* buf)

bool sendto(const std::string& buf)

private:

udpsocket sock_;

// 伺服器端的 ip 和 埠號

std::string ip_;

uint16_t port_;

};

實現英譯漢客戶端

dict_client.cc

#include "udp_client.hpp"

#include int main(int argc, char* ar**)

udpclient client(ar**[1], atoi(ar**[2]));

for (;;)

client.sendto(word);

std::string result;

client.recvfrom(&result);

std::cout << word << " 意思是 " << result << std::endl;

} return 0;

}

乙個簡單的UDP廣播程式

一般使用的socket程式設計都是使用的是一些繫結埠和ip的普通的程式,一旦想要編寫一些特殊的網路應用程式就會出現一些問題。就那這個udp廣播資料的車姑娘許來說,需要設定socket的選項,也就是使用setsockopt來設定socket的一些特殊選項。include include include...

乙個簡單的UDP回射程式 總結UDP程式的基本結構

udp 是面向資料報的無連線的傳輸協議,這與面向位元組流的tcp協議十分不同。所以使用socket編寫的udp程式與tcp程式也是有著本質上的區別的。下面給出乙個典型的udp客戶 服務程式的函式呼叫過程 伺服器 socket bind recvfrom sendto 客戶 socket sendto...

網路 簡單的UDP網路程式

udp網路程式設計的小前提 其大致流程如下 udp伺服器和客戶端實現需要的標頭檔案 include include include 主要分為以下4個板塊 服務端 server include include include include include include include intmai...