實現乙個簡單的英譯漢的功能
備註:套接字的使用,在已經寫過
封裝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...