UDPフルデュプレクス通信の実現
3000 ワード
フルデュプレクス通信を解決するには、2つのスレッド、1つの送信スレッド、キーボードの入力を傍受するには、もう1つは受信スレッド、受信キューを傍受する必要があります.
c++のマルチスレッドプログラミングの問題はここでは述べないが,後で単独でまとめて書くかもしれない.
全二重通信であるため、両クライアントは対等な関係であるべきであり、Aの送信ポートはBの受信ポートに対応しなければならない.例えばAの送信ポートが8000、受信ポートが9000であれば、Bは送信ポートが9000、受信ポートが8000であるべきである.
2つのクライアントのコードは次のとおりです.
もう1つのクライアントは直接コピーして貼り付けるだけでいいですが、IPアドレスとポート番号の変更に注意してください.
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アドレスとポート番号の変更に注意してください.