UDPフルデュプレクス通信の実現


フルデュプレクス通信を解決するには、2つのスレッド、1つの送信スレッド、キーボードの入力を傍受するには、もう1つは受信スレッド、受信キューを傍受する必要があります.
c++のマルチスレッドプログラミングの問題はここでは述べないが,後で単独でまとめて書くかもしれない.
全二重通信であるため、両クライアントは対等な関係であるべきであり、Aの送信ポートはBの受信ポートに対応しなければならない.例えばAの送信ポートが8000、受信ポートが9000であれば、Bは送信ポートが9000、受信ポートが8000であるべきである.
2つのクライアントのコードは次のとおりです.
// UDP-2.cpp :              。
//

#include "stdafx.h"
#include 
#include 
#include 
#include 
#include 
#pragma comment(lib,"WS2_32.lib")

WSADATA wsa;

DWORD WINAPI recv(LPVOID p)
{
	char buf[20];
	sockaddr_in addr_in;
	SOCKET s;
	int len;
	s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
	if (s == INVALID_SOCKET)
	{
		printf("socket failed
"); return -1; } addr_in.sin_family = AF_INET; addr_in.sin_port = htons(8000); addr_in.sin_addr.S_un.S_addr = htonl(INADDR_ANY); if (bind(s, (sockaddr*)&addr_in, sizeof(sockaddr)) == SOCKET_ERROR) { printf("bind failed
"); return -1; } len = sizeof(addr_in); while (1) { memset(buf, 0, sizeof(buf)); if (recvfrom(s, buf, sizeof(buf), 0, (sockaddr*)&addr_in, &len) == SOCKET_ERROR) { printf("recvfrom error
"); return -1; } printf("from: %s:%d
", inet_ntoa(addr_in.sin_addr), ntohs(addr_in.sin_port)); printf("content: %s

", buf); if (strcmp(buf, "quit") == 0) { break; } } closesocket(s); return 0; } DWORD WINAPI send(LPVOID p) { int retval; std::string str; char buf[20]; SOCKET s; sockaddr_in addr_in; s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); addr_in.sin_family = AF_INET; addr_in.sin_port = htons(9000); addr_in.sin_addr.S_un.S_addr = inet_addr("10.36.110.62");//*************** while (1) { //printf("input the content:
"); memset(buf, 0, sizeof(buf)); std::getline(std::cin, str); strcpy(buf, str.c_str()); retval = sendto(s, buf, sizeof(buf), 0, (sockaddr*)&addr_in, sizeof(addr_in)); if (retval == SOCKET_ERROR) { printf("sendt0 failed
"); closesocket(s); WSACleanup(); return -1; } printf("send succeeded

"); if (strcmp(buf, "quit") == 0) { break; } } closesocket(s); return 0; } int main() { HANDLE recvh, sendh; DWORD recv_id, send_id, recv_excode, send_excode; if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0) { printf("startup failed
"); return -1; } recvh = CreateThread(NULL, 0, recv, 0, 0, &recv_id); sendh = CreateThread(NULL, 0, send, 0, 0, &send_id); while (1) { Sleep(1000); GetExitCodeThread(recvh, &recv_excode); GetExitCodeThread(sendh, &send_excode); if (recv_excode != STILL_ACTIVE || send_excode != STILL_ACTIVE) { break; } } printf("
*****end*****
"); getchar(); system("pause"); return 0; }

もう1つのクライアントは直接コピーして貼り付けるだけでいいですが、IPアドレスとポート番号の変更に注意してください.