質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

Q&A

1回答

2705閲覧

winsockについての質問です。サーバ側の動作です。

makino

総合スコア32

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

0グッド

0クリップ

投稿2015/11/08 02:50

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 *" のパラメーターと互換性がありません

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

こんにちは。

error C2664: 'int bind(SOCKET,const sockaddr *,int)' : 引数 2 を 'sockaddr_in *' から 'const sockaddr *' へ変換できません。
IntelliSense: 型 "sockaddr_in *" の引数は型 "const sockaddr *" のパラメーターと互換性がありません

これはメッセージの通りですね。
bind()の第2引き数はsockaddrのようです。sockaddr_inを渡しているからエラーになります。
sockaddr*へキャストすればエラーにはならない筈です。

ただ、私はwinsockは昔にちょっとしかやってないので、そのようなキャストが正当なのか分かりません。
正しそうな記憶があるのですが、自信がないです。

error C2360: 'buffchat' の初期化が 'case' ラベルによって行われませんでした。

buffchat[]の定義と初期化をcaseラベル内で直に行うと出るエラーです。
case FD_ACCEPT:内の処理を{}で囲えばOKです。

ところで、Cでコンバイルすると異なるエラーがでました。C++でコンパイルされているようですね。
デフォルトでは、拡張子をcppにしているとC++でコンパイルされます。

投稿2015/11/08 03:16

編集2015/11/08 03:33
Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

makino

2015/11/08 03:35

早速の回答ありがとうございます! >>ところで、Cでコンバイルすると異なるエラーがでました。C++でコンパイルされているようですね。 デフォルトでは、拡張子をcppにしているとC++でコンパイルされます。 拡張子変えたらエラーがなくなりました!本当に助かりました! 図々しいのですが、acceptで何故エラーが起きるのかも教えて頂ければ幸いです。 コネクトされない…
Chironian

2015/11/08 04:07

ごめんなさい。winsockはちょっとしかやってないので、よく分かりません。 下記に参考になりそうなサンプルがあります。 http://eternalwindows.jp/network/winsock/winsock05s.html ところで、何をするとaccept()でどんなエラーが起きるのか、書かれていないようです。その辺も記述されるとより適切な回答が返って来やすいと思いますよ。
makino

2015/11/08 09:37

ありがとうございます すみません、返信があったことに気が付かなくて、すぐにサンプルを確認します
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問