環境
OS: Ubuntu 20.04
前提
C++でUDPソケットを作成しています.
実現したいこと
現在のものは, サーバがバッファにメッセージを貯めてまとめて表示するようになっています. デバッグのために受信した都度コンソールに表示をしたい.
該当のソースコード
udp_sever.cpp
#include <stdio.h> #include <string.h> #include "udp_socket.hpp" #include <unistd.h> const int PortNumber = 50000; //49152~65535 const char *IPaddress = "192.168.10.103"; //recv側のip const int recv_max_size = 10; //受け取る個数 const int64_t timeout_setting = 10; int main(int argc, char** argv) { UDPSocket udp0(IPaddress, PortNumber); //バインド udp0.udp_bind(); for(int i = 0; i < recv_max_size; i++) { //タイムアウト timeout_setting秒経過で閉じる if(udp0.timeout(timeout_setting) == 0) { perror("time out"); break; } //データ受け取り std::string data = udp0.udp_recv(); //コンソールに表示 printf("%s\n", data.c_str()); } return 0; }
udp_socket.hpp
#include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> #include <string> #include <string.h> class UDPSocket{ int sock; struct sockaddr_in addr; public: UDPSocket(std::string address, int port){ sock = socket(AF_INET, SOCK_DGRAM, 0); addr.sin_family = AF_INET; addr.sin_addr.s_addr = inet_addr(address.c_str()); addr.sin_port = htons(port); } void udp_send(std::string word){ sendto(sock, word.c_str(), word.length(), 0, (struct sockaddr *)&addr, sizeof(addr)); } void udp_bind(){ bind(sock, (const struct sockaddr *)&addr, sizeof(addr)); } int timeout(int64_t sec) { // 読み込み集合FDを空に FD_ZERO(&readfds); // 読み込み集合FDにsdを追加 FD_SET(sd, &readfds); tv.tv_sec = sec; return select(sd + 1, &readfds, NULL, NULL, &tv); } std::string udp_recv(){ #define BUFFER_MAX 400 char buf[BUFFER_MAX]; memset(buf, 0, sizeof(buf)); recv(sock, buf, sizeof(buf), 0); return std::string(buf); } void udp_recv(char *buf, int size){ memset(buf, 0, size); recv(sock, buf, size, 0); } ~UDPSocket(){ close(sock); } private: int sd; struct sockaddr_in addr; socklen_t sin_size; struct sockaddr_in from_addr; fd_set readfds; struct timeval tv; };
試したこと
straceコマンドでログを取ってみたところ, recvfromは正常に動いていた. 最後にまとめてwriteするためrecvfromするたびにwriteさせたい.
0 コメント