#5
by にこよん » 6年前
nは普通にサイズを表してくれています
mはこのように書いています
コード:
//データ通信で使用できる最大サイズ
#define MAX_DATA_SIZE 262144
コード:
char buf[MAX_DATA_SIZE];
memset(buf, 0, sizeof(buf));
int n = recv(sock, buf, sizeof(buf), 0);
てっきりmemcpyを使うこと自体が間違いなのかと思っていたのですが、そうではないのでしょうか?
一応送受信のプログラムを貼っておきます
必要なければスルーでお願いします
(見ずらい貼り方ですみません)
//ヘッダ
コード:
class SERVER {
SOCKET sock_lobby; //通信要請を受け取るソケット
sockaddr_in addr; //ロビーのアドレス情報
SOCKET sock; //クライアントとの通信を行うソケット
sockaddr_in client_addr; //クライアント情報
SOCKET udp_sock;
sockaddr_in udp_addr; //ロビーのアドレス情報
public:
//コンストラクタ
SERVER();
//サーバーのスタートアップ処理
int Stert();
//クライアントからの通信を受け取る
int Accept();
//データを送信する
int Send(const TCHAR *data, const int size);
//データを受信する
int Recv(char data[]);
//UDP通信のスタートアップ処理
int UDPstert();
//データを送信する
int UDPsend(const char data[]);
//データを受信する
int UDPrecv(char data[1024]);
//UDP通信を終了する
int UDPend();
};
class CLIENT {
struct sockaddr_in server_addr;
SOCKET sock;
public:
//コンストラクタ
CLIENT();
//データをサーバーに送信する
int Send(const TCHAR *data, int size);
//データをサーバーから受信する
int Recv(char data[]);
};
//cpp
コード:
SERVER::SERVER() {
}
int SERVER::Stert() {
sock_lobby = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); //ソケットの作成
if (sock_lobby == INVALID_SOCKET) {
WSA_ERR("ソケットの作成に失敗しました(%d)", WSAGetLastError());
return COMM_LIB_ERROR;
}
else AddTempLog("ロビーソケットを作成しました");
bool yes = true; //1が登録されたポインタを作成
setsockopt(sock_lobby, SOL_SOCKET, SO_REUSEADDR, (const char *)&yes, sizeof(yes)); //TIME_WAIT状態への対策(ソケットオプションの設定
addr.sin_family = AF_INET; //ソケットの設定をする
addr.sin_port = htons(PORT); //使用するポート
addr.sin_addr.S_un.S_addr = INADDR_ANY; //接続するアドレス
if (bind(sock_lobby, (struct sockaddr *)&addr, sizeof(addr)) != 0) {
WSA_ERR("ローカルアドレスとソケットの関連付けに失敗しました(%d)", WSAGetLastError());
return COMM_LIB_ERROR;
}
else AddTempLog("ローカルアドレスとソケットの関連付けが完了しました");
u_long val = 1; //ノンブロッキング(非同期通信)に設定する
ioctlsocket(sock_lobby, FIONBIO, &val);
if (listen(sock_lobby, 5) != 0) { //TCPクライアントからの接続要求を待てる状態にする
WSA_ERR("ソケットをリッスン状態にできませんでした(%d)", WSAGetLastError());
return COMM_LIB_ERROR;
}
else AddTempLog("ソケットを通信受付状態にしました");
AddTempLog("ロビーソケットの初期化が正常に終了しました port=%d", PORT);
return COMM_LIB_NO_ERROR;
}
int SERVER::Accept() {
int len = sizeof(client_addr); //TCPクライアントからの接続要求を受け付ける
sock = accept(sock_lobby, (struct sockaddr *)&client_addr, &len);
if (sock == INVALID_SOCKET) { //ソケットの値が正常ではない
if (WSAGetLastError() != WSAEWOULDBLOCK) { //要請がない場合ではなかったら
WSA_ERR("クライアントからの接続に失敗しました(%d)", WSAGetLastError());
return COMM_LIB_ERROR;
}
}
else { //接続要請があれば
hostent *host = gethostbyaddr((const char *)&client_addr.sin_addr, sizeof(addr.sin_addr), AF_INET);
if (host == NULL) { //失敗したらエラーを表示して終了
WSA_ERR("ホスト情報の取得に失敗しました(%d)", WSAGetLastError());
return COMM_LIB_ERROR;
}
AddServerLog(" accepted connection from [%s], ip=%s, port=%d", host->h_name, inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));
return 1;
}
return COMM_LIB_NO_ERROR;
}
int SERVER::Recv(char data[]) {
char buf[MAX_DATA_SIZE];
memset(buf, 0, sizeof(buf));
int n = recv(sock, buf, sizeof(buf), 0);
if (n < 0) {
if (WSAGetLastError() != WSAEWOULDBLOCK) { //何らかのエラーが発生している
WSA_ERR("データの受信に失敗しました(%d)", WSAGetLastError());
return COMM_LIB_ERROR;
}
}
else if (n != 0) { //データが届いたら
AddTempLog("データを受信しました-%d「%.64s」", n, buf);
sprintf_s(data, 1024, "%s", buf);
return n;
}
return COMM_LIB_NO_ERROR;
}
int SERVER::Send(const TCHAR *data, int size) {
if (send(sock, data, /*strlen(data)*/size, 0) < 1) {
WSA_ERR("データの送信に失敗しました(%d)", WSAGetLastError());
closesocket(sock); //TCPセッションの終了
memset(&sock, 0, sizeof(sock));
return COMM_LIB_ERROR;
}
else AddTempLog("データを送信しました「%.64s」", data);
closesocket(sock); //TCPセッションの終了
memset(&sock, 0, sizeof(sock));
return COMM_LIB_NO_ERROR;
}
CLIENT::CLIENT() {
}
int CLIENT::Recv(char data[]) {
char buf[MAX_DATA_SIZE];
memset(buf, 0, sizeof(buf));
int n = recv(sock, buf, sizeof(buf), 0);
if (n < 0) {
if (WSAGetLastError() != WSAEWOULDBLOCK) { //何らかのエラーが発生している
WSA_ERR("データの受信に失敗しました(%d)", WSAGetLastError());
return COMM_LIB_ERROR;
}
}
else if (n != 0) { //データが届いたら
AddTempLog("データを受信しました-%d「%.64s」", n, buf);
closesocket(sock); //TCPセッションの終了
memset(&sock, 0, sizeof(sock));
sprintf_s(data, n, "%s", buf);
return n;
}
return COMM_LIB_NO_ERROR;
}
int CLIENT::Send(const TCHAR *data, int size) {
sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); //ソケットの作成
if (sock == INVALID_SOCKET) {
WSA_ERR("ソケットの作成に失敗しました(%d)", WSAGetLastError());
return COMM_LIB_ERROR;
}
else AddTempLog("ソケットを作成しました");
server_addr.sin_family = AF_INET; //ソケットの設定をする
server_addr.sin_port = htons(PORT); //使用するポート
hostent *host = gethostbyname(host_name); //リリース時にはホストIPを使う
if (host == NULL) {
WSA_ERR("サーバー情報がありません");
return COMM_LIB_ERROR;
}
server_addr.sin_addr.S_un.S_addr = *(unsigned int *)host->h_addr_list[0]; //サーバーIPアドレスを取得する
AddTempLog("サーバー情報の取得に成功しました");
if (connect(sock, (struct sockaddr *)&server_addr, sizeof(server_addr)) != 0) {//サーバに接続を試みる
WSA_ERR("サーバーに接続できませんでした(%d)", WSAGetLastError());
return COMM_LIB_ERROR;
}
else AddTempLog("サーバーに接続しました");
if (send(sock, data, size, 0) < 1) {
WSA_ERR("データの送信に失敗しました(%d)", WSAGetLastError());
return COMM_LIB_ERROR;
}
else AddTempLog("データの送信に成功しました");
return COMM_LIB_NO_ERROR;
}
nは普通にサイズを表してくれています
mはこのように書いています
[code]//データ通信で使用できる最大サイズ
#define MAX_DATA_SIZE 262144
[/code]
[code]
char buf[MAX_DATA_SIZE];
memset(buf, 0, sizeof(buf));
int n = recv(sock, buf, sizeof(buf), 0);
[/code]
てっきりmemcpyを使うこと自体が間違いなのかと思っていたのですが、そうではないのでしょうか?
一応送受信のプログラムを貼っておきます
必要なければスルーでお願いします
(見ずらい貼り方ですみません)
//ヘッダ
[code]
class SERVER {
SOCKET sock_lobby; //通信要請を受け取るソケット
sockaddr_in addr; //ロビーのアドレス情報
SOCKET sock; //クライアントとの通信を行うソケット
sockaddr_in client_addr; //クライアント情報
SOCKET udp_sock;
sockaddr_in udp_addr; //ロビーのアドレス情報
public:
//コンストラクタ
SERVER();
//サーバーのスタートアップ処理
int Stert();
//クライアントからの通信を受け取る
int Accept();
//データを送信する
int Send(const TCHAR *data, const int size);
//データを受信する
int Recv(char data[]);
//UDP通信のスタートアップ処理
int UDPstert();
//データを送信する
int UDPsend(const char data[]);
//データを受信する
int UDPrecv(char data[1024]);
//UDP通信を終了する
int UDPend();
};
class CLIENT {
struct sockaddr_in server_addr;
SOCKET sock;
public:
//コンストラクタ
CLIENT();
//データをサーバーに送信する
int Send(const TCHAR *data, int size);
//データをサーバーから受信する
int Recv(char data[]);
};
[/code]
//cpp
[code]
SERVER::SERVER() {
}
int SERVER::Stert() {
sock_lobby = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); //ソケットの作成
if (sock_lobby == INVALID_SOCKET) {
WSA_ERR("ソケットの作成に失敗しました(%d)", WSAGetLastError());
return COMM_LIB_ERROR;
}
else AddTempLog("ロビーソケットを作成しました");
bool yes = true; //1が登録されたポインタを作成
setsockopt(sock_lobby, SOL_SOCKET, SO_REUSEADDR, (const char *)&yes, sizeof(yes)); //TIME_WAIT状態への対策(ソケットオプションの設定
addr.sin_family = AF_INET; //ソケットの設定をする
addr.sin_port = htons(PORT); //使用するポート
addr.sin_addr.S_un.S_addr = INADDR_ANY; //接続するアドレス
if (bind(sock_lobby, (struct sockaddr *)&addr, sizeof(addr)) != 0) {
WSA_ERR("ローカルアドレスとソケットの関連付けに失敗しました(%d)", WSAGetLastError());
return COMM_LIB_ERROR;
}
else AddTempLog("ローカルアドレスとソケットの関連付けが完了しました");
u_long val = 1; //ノンブロッキング(非同期通信)に設定する
ioctlsocket(sock_lobby, FIONBIO, &val);
if (listen(sock_lobby, 5) != 0) { //TCPクライアントからの接続要求を待てる状態にする
WSA_ERR("ソケットをリッスン状態にできませんでした(%d)", WSAGetLastError());
return COMM_LIB_ERROR;
}
else AddTempLog("ソケットを通信受付状態にしました");
AddTempLog("ロビーソケットの初期化が正常に終了しました port=%d", PORT);
return COMM_LIB_NO_ERROR;
}
int SERVER::Accept() {
int len = sizeof(client_addr); //TCPクライアントからの接続要求を受け付ける
sock = accept(sock_lobby, (struct sockaddr *)&client_addr, &len);
if (sock == INVALID_SOCKET) { //ソケットの値が正常ではない
if (WSAGetLastError() != WSAEWOULDBLOCK) { //要請がない場合ではなかったら
WSA_ERR("クライアントからの接続に失敗しました(%d)", WSAGetLastError());
return COMM_LIB_ERROR;
}
}
else { //接続要請があれば
hostent *host = gethostbyaddr((const char *)&client_addr.sin_addr, sizeof(addr.sin_addr), AF_INET);
if (host == NULL) { //失敗したらエラーを表示して終了
WSA_ERR("ホスト情報の取得に失敗しました(%d)", WSAGetLastError());
return COMM_LIB_ERROR;
}
AddServerLog(" accepted connection from [%s], ip=%s, port=%d", host->h_name, inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));
return 1;
}
return COMM_LIB_NO_ERROR;
}
int SERVER::Recv(char data[]) {
char buf[MAX_DATA_SIZE];
memset(buf, 0, sizeof(buf));
int n = recv(sock, buf, sizeof(buf), 0);
if (n < 0) {
if (WSAGetLastError() != WSAEWOULDBLOCK) { //何らかのエラーが発生している
WSA_ERR("データの受信に失敗しました(%d)", WSAGetLastError());
return COMM_LIB_ERROR;
}
}
else if (n != 0) { //データが届いたら
AddTempLog("データを受信しました-%d「%.64s」", n, buf);
sprintf_s(data, 1024, "%s", buf);
return n;
}
return COMM_LIB_NO_ERROR;
}
int SERVER::Send(const TCHAR *data, int size) {
if (send(sock, data, /*strlen(data)*/size, 0) < 1) {
WSA_ERR("データの送信に失敗しました(%d)", WSAGetLastError());
closesocket(sock); //TCPセッションの終了
memset(&sock, 0, sizeof(sock));
return COMM_LIB_ERROR;
}
else AddTempLog("データを送信しました「%.64s」", data);
closesocket(sock); //TCPセッションの終了
memset(&sock, 0, sizeof(sock));
return COMM_LIB_NO_ERROR;
}
CLIENT::CLIENT() {
}
int CLIENT::Recv(char data[]) {
char buf[MAX_DATA_SIZE];
memset(buf, 0, sizeof(buf));
int n = recv(sock, buf, sizeof(buf), 0);
if (n < 0) {
if (WSAGetLastError() != WSAEWOULDBLOCK) { //何らかのエラーが発生している
WSA_ERR("データの受信に失敗しました(%d)", WSAGetLastError());
return COMM_LIB_ERROR;
}
}
else if (n != 0) { //データが届いたら
AddTempLog("データを受信しました-%d「%.64s」", n, buf);
closesocket(sock); //TCPセッションの終了
memset(&sock, 0, sizeof(sock));
sprintf_s(data, n, "%s", buf);
return n;
}
return COMM_LIB_NO_ERROR;
}
int CLIENT::Send(const TCHAR *data, int size) {
sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); //ソケットの作成
if (sock == INVALID_SOCKET) {
WSA_ERR("ソケットの作成に失敗しました(%d)", WSAGetLastError());
return COMM_LIB_ERROR;
}
else AddTempLog("ソケットを作成しました");
server_addr.sin_family = AF_INET; //ソケットの設定をする
server_addr.sin_port = htons(PORT); //使用するポート
hostent *host = gethostbyname(host_name); //リリース時にはホストIPを使う
if (host == NULL) {
WSA_ERR("サーバー情報がありません");
return COMM_LIB_ERROR;
}
server_addr.sin_addr.S_un.S_addr = *(unsigned int *)host->h_addr_list[0]; //サーバーIPアドレスを取得する
AddTempLog("サーバー情報の取得に成功しました");
if (connect(sock, (struct sockaddr *)&server_addr, sizeof(server_addr)) != 0) {//サーバに接続を試みる
WSA_ERR("サーバーに接続できませんでした(%d)", WSAGetLastError());
return COMM_LIB_ERROR;
}
else AddTempLog("サーバーに接続しました");
if (send(sock, data, size, 0) < 1) {
WSA_ERR("データの送信に失敗しました(%d)", WSAGetLastError());
return COMM_LIB_ERROR;
}
else AddTempLog("データの送信に成功しました");
return COMM_LIB_NO_ERROR;
}
[/code]