サーバー→クライアントから送信された文字列を受信して表示するだけ
クライアント→サーバーへ文字列を送信するだけ
というサンプル例しか見つかりませんでした。これを応用すればいいのは分かるのですが、いろいろ弄ってみても思った動作をしてくれません
Echoサーバーとかいうのもあるようですが、説明がほとんど無く、プログラムを見ても良く分からなかったので
取りあえずはWinSockの基本関数のみを用いてP2P型で相互通信ができるようになりたいです。
(データはプログラム内で勝手に決めておく)
最終的な目標はC/S型で構造体送受信が出来るようになりたいです。(クライアント人数は増減せず固定とする。&DxLibとの共存)
UDPは調子が悪いようなのでTCPオンリーで取り合えず行きます
真に申し訳ありませんが、自分に追い込みを掛けるため、と申しましょうか。
プログラムの稼動実験をMMOの友達に頼んだ上、試験日を2/18(土)18:00~
と宣言してしまったので、何としてもそれまでに最終目標は達成したいです。
基本骨格はこのサイトを使用しています
クライアント→メッセージを送信後、サーバーからメッセージを受信する。
#include <stdio.h>
#include <winsock2.h>
int main()
{
WSADATA wsaData;
struct sockaddr_in Recv, Send;
SOCKET RecvSock, SendSock;
char buf[32];
//winsock2の初期化
WSAStartup(MAKEWORD(2,0), &wsaData);
// ソケットの作成
RecvSock = socket(AF_INET, SOCK_STREAM, 0);
SendSock = socket(AF_INET, SOCK_STREAM, 0);
// 接続先指定用構造体の準備
Recv.sin_family = AF_INET;
Recv.sin_port = htons(12345);
Recv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
// 接続先指定用構造体の準備
Send.sin_family = AF_INET;
Send.sin_port = htons(12346);
Send.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
bind(SendSock, (struct sockaddr *)&Send, sizeof(Send));
// サーバに接続
connect( RecvSock, (struct sockaddr *)&Recv, sizeof(Recv) );
send( SendSock, "HELLO", 5, 0);
// サーバからデータを受信
memset(buf, 0, sizeof(buf));
int n = recv( RecvSock, buf, sizeof(buf), 0 );
printf("%d, %s\n", n, buf);
// winsock2の終了処理
WSACleanup();
return 0;
}
#include <stdio.h>
#include <winsock2.h>
int main()
{
//winsock2の初期化
WSADATA wsaData;
WSAStartup( MAKEWORD(2,0), &wsaData );
//ソケットの作成
SOCKET RecvSock = socket(AF_INET, SOCK_STREAM, 0);
SOCKET SendSock = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in Recv, Send;
int len;
// 接続先指定用構造体の準備
Send.sin_family = AF_INET;
Send.sin_port = htons(12345);
Send.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
bind( SendSock, (struct sockaddr *)&Send, sizeof(Send));
//ソケットの設定
Recv.sin_family = AF_INET;//IPv4。IPv6ならAF_INET6
Recv.sin_port = htons(12346);//ポート番号
Recv.sin_addr.S_un.S_addr = INADDR_ANY;//どのアドレスから接続してもおk
bind(RecvSock, (struct sockaddr *)&Recv, sizeof(Recv) );
//TCPクライアントからの接続要求を待てる状態にする。数字は5
listen( RecvSock, 5 );
//TCPクライアントからの接続要求を受け付ける
len = sizeof( Send );
SendSock = accept(RecvSock, (struct sockaddr *)&Send, &len);
char buf[32];
// サーバからデータを受信
memset(buf, 0, sizeof(buf));
int n = recv( RecvSock, buf, sizeof(buf), 0 );
printf("%d, %s\n", n, buf);
// 5文字送信
send(SendSock, "HELLO", 5, 0);
// TCPセッションの終了
closesocket(SendSock);
closesocket(RecvSock);
// winsock2の終了処理
WSACleanup();
return 0;
}
どうしたらいいか教えてください