winsockについての質問です。
以下のプログラムを書いたのですが、
acceptとその他でエラーが発生します。
ただクライアント側に文字を送りたい、受け取りたいだけのですが…
私が馬鹿で申し訳ないのですが、ご回答お願いします。
また、ここを勉強した方がいい、参考書などがあれば教えてください。
#include <windows.h>
#include <stdio.h>
#define WINDOWS_CLASS_NAME TEXT("WisdomSoft.Sample.Window")
#pragma comment(lib, "wsock32.lib")
//#include <winsock2.h>
#define WM_SOCKET WM_APP
#define WSAGETSELECTEVENT(lParam) LOWORD(lParam)
#define WSAGETSELECTERROR(lParam) HIWORD(lParam)
TEXTMETRIC tm;
int InitializeWindow(CREATESTRUCT* createWindowArgs){
return 0;
}
LRESULT CALLBACK SampleWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps; HDC hdc; RECT rt; //ウィンドウの大きさの定義 static HANDLE hFile; //ファイルのオープンに使用 DWORD dwBytes; static HFONT hfont1; static HFONT hfontOld; //● winsockで利用。 WSADATA wsaData; //初期化で利用。 SOCKET sock = INVALID_SOCKET; //サーバ側のソケット SOCKET Newsock; //acceptで新たに作成される struct sockaddr_in addr; //bindで使用 struct sockaddr_in client; //acceptで使用 int len; //client構造体の長さ char buf[10]; //文字の入力用 int error; //エラー処理用 int sn; switch (uMsg) { case WM_CREATE: { // ウィンドウ作成時に1回のみ実行される // ↓ ここからwinsockについて。 // ↓ ここからwinsockについて。 //初期化の処理。 error = WSAStartup(MAKEWORD(2, 0), &wsaData); if (error != 0){ //WSAStartupは成功の場合0を返す。 return 1; } //ソケットの作成。 sock = socket(AF_INET, SOCK_STREAM, 0); if (sock == INVALID_SOCKET){ //socketはエラーの場合INVALID_SOCKETを返す。 return 1; } //●非同期の処理。 if (WSAAsyncSelect(sock, hwnd, WM_SOCKET, FD_ACCEPT) == SOCKET_ERROR){ Beep(740, 200); //エラー音 } //通信に必要なIPアドレス・ポート番号を持つ構造体。 addr.sin_family = AF_INET; //アドレスファミリ。固定 addr.sin_port = htons(12345); //ポート番号 addr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);; //IPアドレス。INADDR_ANYはどのIPでもOK。 //↑の構造体を利用 //アドレスと結びつける if (bind(sock, (struct sockaddr_in *)&addr, sizeof(addr)) == SOCKET_ERROR){ Beep(740, 200); //エラー音 } //第2引数は、キューの最大サイズ。 if (listen(sock, 4) == SOCKET_ERROR){ Beep(740, 200); //エラー音 } //フォント作成。変更しない。 hfont1 = CreateFont(16, 8, 0, 0, FW_NORMAL, FALSE, FALSE, 0, SHIFTJIS_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH, "MS ゴシック"); return InitializeWindow((CREATESTRUCT*)lParam); break; } case WM_SOCKET: switch (WSAGETSELECTEVENT(lParam)) { case FD_ACCEPT: //クライアントからの接続許可。 len = sizeof(client); Newsock = accept(sock, (struct sockaddr *)&client, &len); //acceptの第3引数はポインタなので。 if (Newsock == INVALID_SOCKET) { Beep(740, 200); //エラー音 break; } char buffchat[] = "CHAT"; if (send(Newsock, buffchat, 4, 0) == SOCKET_ERROR){ Beep(740, 200); //エラー音 *buf = WSAGetLastError(); } //●非同期の処理2。 WSAAsyncSelect(Newsock, hwnd, WM_SOCKET, FD_READ | FD_CLOSE); break; case FD_READ:{ memset(buf, 0, sizeof(buf)); sn = recv(Newsock, buf, sizeof(buf), 0); //nにはデータのバイト数が入る }break; case FD_CLOSE:{ //終了処理。 closesocket(sock); //TCPの処理。WSACleanupの上に書く。 WSACleanup(); //winsock自体。引数はない。 }break; } case WM_PAINT: // TODO: 描画コードをここに追加してください... hdc = BeginPaint(hwnd, &ps); hfontOld = (HFONT)SelectObject(hdc, hfont1); GetTextMetrics(hdc, &tm); TextOut(hdc, 0, (tm.tmHeight), buf, 4); //TextOut(hdc, 15, (tm.tmHeight), "エラー", 6); SelectObject(hdc, hfontOld); EndPaint(hwnd, &ps); break; case WM_DESTROY: //WM_DESTROY ウィンドウの終了と同時にアプリの終了も行う。 //PostQuitMessage 引数をwParamに設定し、アプリケーションの終了コードとする。 return 0; break; default: return DefWindowProc(hwnd, uMsg, wParam, lParam);//!! //標準的なウィンドウの動作を提供。動いたり拡大したり。 } return 0;
}
error C2664: 'int bind(SOCKET,const sockaddr *,int)' : 引数 2 を 'sockaddr_in *' から 'const sockaddr *' へ変換できません。
error C2360: 'buffchat' の初期化が 'case' ラベルによって行われませんでした。
IntelliSense: 型 "sockaddr_in *" の引数は型 "const sockaddr *" のパラメーターと互換性がありません
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/11/08 03:35
2015/11/08 04:07
2015/11/08 09:37