/*  デスクトップ送信実験クライアント 2003/ 5/16 宍戸 輝光 */ #include #include #include #include #pragma comment(lib, "wsock32.lib") /* VC++では、コメントをはずしてwinmm.libをリンク #pragma comment(lib, "winmm.lib") */ main() { SOCKET sConnect; WSADATA wdData; struct sockaddr_in saConnect, saLocal; DWORD dwAddr, dwStart, dwEnd; HDC hdc, hdcMem; HBITMAP hBMP, hOld; LPBYTE lpPixels, lpBuf; int iWidth, iHeight; LPCTSTR lpszAddr = "127.0.0.1"; WORD wPort = 7000; int iBufferSize, iSendSize = 1024, iLineSize, iSend; char data; /* ディスプレイのデバイスコンテキスト作成 */ hdc = CreateDC("DISPLAY", NULL, NULL, NULL); /* 画面サイズ取得 */ iWidth = GetDeviceCaps(hdc, HORZRES); iHeight = GetDeviceCaps(hdc, VERTRES); BITMAPINFO biInfo; /* DIBSection用BITMAPINFO構造体設定 */ biInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); biInfo.bmiHeader.biWidth = iWidth; biInfo.bmiHeader.biHeight = iHeight; biInfo.bmiHeader.biPlanes = 1; biInfo.bmiHeader.biBitCount = 24; biInfo.bmiHeader.biCompression = BI_RGB; biInfo.bmiHeader.biSizeImage = 0; biInfo.bmiHeader.biXPelsPerMeter = 0; biInfo.bmiHeader.biYPelsPerMeter = 0; biInfo.bmiHeader.biClrUsed = 0; biInfo.bmiHeader.biClrImportant = 0; /* BITMAPINFOと画面のDC からDIBSection を作成 */ hBMP = CreateDIBSection(hdc, &biInfo, DIB_RGB_COLORS, (LPVOID *)&lpPixels, NULL, 0); /* メモリDC を作成 */ hdcMem = CreateCompatibleDC(hdc); /* メモリDC にDIBSectionを選択 */ hOld = (HBITMAP)SelectObject(hdcMem, hBMP); /* 画面全体をDIBSection のビットマップにコピー */ BitBlt(hdcMem, 0, 0, iWidth, iHeight, hdc, 0, 0, SRCCOPY); /* 送信データサイズ計算 */ iBufferSize = 8 + iWidth * iHeight * 3; /* 送信データ用バッファ確保 */ lpBuf = (LPBYTE)HeapAlloc(GetProcessHeap(), 0, iBufferSize); /* バッファ先頭に画像サイズ書き込み */ ((int *)lpBuf)[0] = iWidth; ((int *)lpBuf)[1] = iHeight; /* バッファに画面の画像データをコピー */ CopyMemory(lpBuf+8, lpPixels, iWidth * iHeight * 3); WSAStartup(MAKEWORD(1,1),&wdData); dwAddr = inet_addr(lpszAddr); sConnect = socket(PF_INET,SOCK_STREAM,0); ZeroMemory(&saConnect, sizeof(sockaddr_in)); ZeroMemory(&saLocal, sizeof(sockaddr_in)); saLocal.sin_family = AF_INET; saLocal.sin_addr.s_addr = INADDR_ANY; saLocal.sin_port = 0; bind(sConnect, (LPSOCKADDR)&saLocal, sizeof(saLocal)); saConnect.sin_family = AF_INET; saConnect.sin_addr.s_addr = dwAddr; saConnect.sin_port = htons(wPort); /* サーバーに接続 */ if (connect(sConnect, (sockaddr *)(&saConnect), sizeof(saConnect)) == SOCKET_ERROR) { printf("接続エラー"); closesocket(sConnect); WSACleanup(); return 1; } printf("送信開始\r\n"); /* 画像サイズを送信 */ send(sConnect, (char *)lpBuf, 8, 0); /* 送信済みサイズ設定 */ iSend = 8; /* サーバーからの応答待ち */ while(recv(sConnect,&data,1,0) != 1); /* timeGetTimeの精度設定 */ timeBeginPeriod(1); /* 送信開始時刻を記録 */ dwStart = timeGetTime(); /* データ送信 */ while (iSend != iBufferSize) { /* データ送信サイズを計算 */ if (iLineSize > iBufferSize - iSend) { iLineSize = iBufferSize - iSend; } else { iLineSize = iSendSize; } /* データ送信 */ iLineSize = send(sConnect, (char *)(lpBuf + iSend), iLineSize, 0); if (iLineSize > 0) { iSend += iLineSize; } else { break; } } dwEnd = timeGetTime(); /* 送信に要した時間とビットレートを表示 */ if (dwEnd - dwStart >0) { printf("送信:%dバイト受信完了 通信時間:%dms(%dKbps)", iSend - 8, dwEnd - dwStart, ((iSend - 8) * 8) / (dwEnd - dwStart)); } timeEndPeriod(1); closesocket(sConnect); SelectObject(hdcMem, hOld); DeleteObject(hBMP); DeleteDC(hdcMem); DeleteDC(hdc); /* 送信データバッファ解放 */ HeapFree(GetProcessHeap(), 0, lpBuf); WSACleanup(); return 0; }