ENetライブラリを使用しようとしています。これは、信頼できる UDP ソケットでプログラミングするためのものです。Feature
公式サイトのタブには次のように書かれています。
ENet は、サイズに関係なくパケットを送受信します。大きなパケットは、適切なサイズの多数の小さなパケットに断片化され、配信用に元のパケットを復元するために外部ホストで再構成されます。このプロセスは、開発者に対して完全に透過的です。
単純なサーバー/クライアントでテストしました。1k データをサーバーに送信しても問題ありませんが、データが 2k に達するとサーバーに受信されないようです。
私のコード:
// サーバー
#include <string>
#include <iostream>
#include <enet/enet.h>
using namespace std;
void main()
{
// initialize
if(enet_initialize()) {
cout << "fail init" << endl;
return;
}
ENetAddress address;
address.host = ENET_HOST_ANY;
address.port = 9000;
ENetHost* server;
server = enet_host_create(&address,
512,
2,
0,
0);
if(server == NULL) {
cout << "fail create host" << endl;
enet_deinitialize();
return;
}
ENetEvent event;
while(enet_host_service(server, &event, 5000) >= 0) {
if(event.type == ENET_EVENT_TYPE_CONNECT) { // client connected
static unsigned int num = 0;
ENetAddress remote = event.peer->address; // peer address
char ip[256];
enet_address_get_host_ip(&remote, ip, 256);
cout << "ip:" << ip << " connected, id: " << num << endl;
event.peer->data = (void*)num++;
} else if(event.type == ENET_EVENT_TYPE_RECEIVE) { // recv data
cout << "received data at channel: " << event.channelID << endl;
cout << "data length: " << event.packet->dataLength << endl;
cout << "data: " << string((char*)event.packet->data, event.packet->dataLength) << endl;
enet_packet_destroy(event.packet); // free
cout << endl;
} else if(event.type == ENET_EVENT_TYPE_DISCONNECT) { // disconnect
cout << "id " << event.peer->data << " disconnected" << endl;
}
}
enet_deinitialize();
}
//クライアント
#include <string>
#include <iostream>
#include <enet/enet.h>
using namespace std;
void main()
{
if(enet_initialize()) {
cout << "fail init" << endl;
return;
}
ENetHost* client = enet_host_create(NULL,
1,
2,
0,
0);
if(client == NULL) {
cout << "fail create client" << endl;
return;
}
ENetAddress svraddr;
enet_address_set_host(&svraddr, "127.0.0.1");
svraddr.port = 9000;
ENetPeer* server = enet_host_connect(client, &svraddr, 2, 0);
if(server == NULL) {
cout << "fail connect" << endl;
return;
}
ENetEvent event;
if(enet_host_service (client, &event, 5000) > 0 &&
event.type == ENET_EVENT_TYPE_CONNECT) {
cout << "connected successfully" << endl;
} else {
enet_peer_reset (server);
cout << "failed to connect" << endl;
return;
}
string data(1024, 'a'); // <--------------- ok
string data(2 * 1024, 'a'); // <--------------- fail
ENetPacket* packet1 = enet_packet_create(data.c_str(), data.length(), ENET_PACKET_FLAG_RELIABLE);
if(!packet1) {
cout << "create packet fail" << endl;
return;
}
if(enet_peer_send(server, 0, packet1) < 0) {
cout << "send fail" << endl;
return;
}
enet_host_flush (client);
enet_peer_disconnect (server, 0);
while(enet_host_service (client, &event, 5000) > 0) {
switch(event.type) {
case ENET_EVENT_TYPE_RECEIVE:
enet_packet_destroy (event.packet);
break;
case ENET_EVENT_TYPE_DISCONNECT:
cout << "disconnected" << endl;
enet_deinitialize();
return;
}
}
enet_peer_reset(server);
cout << "force reset" << endl;
enet_deinitialize();
}
コードに問題はありますか?