Bug(1)
程序要求:內(nèi)網(wǎng)之間客戶端截屏(.bmp)并傳送給服務(wù)端。
server:
#include <winsock2.h> // 為了使用Winsock API函數(shù) #include <stdio.h> #include <windows.h>#include<fstream> using namespace std;// 告訴連接器與WS2_32庫(kù)連接 #pragma comment(lib,"WS2_32.lib")DWORD rem=0,num=0; void stranl(char *_str) {char _rem[16];char _num[32];int i,j=0;for(i=0;_str[i]!='#';i++){_num[i]=_str[i];}_num[i]='\0';i++;for(;_str[i]!='\0';i++){_rem[j]=_str[i];j++;}_rem[j]='\0';num=atoi(_num);rem=atoi(_rem);} int main(int argc, char* argv[]) {// 初始化WS2_32.dll WSADATA wsaData;WORD sockVersion = MAKEWORD(2, 0);::WSAStartup(sockVersion, &wsaData);// 創(chuàng)建套節(jié)字SOCKET s = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if(s == INVALID_SOCKET){printf("Failed socket() \n");::WSACleanup();return 0;}// 填充sockaddr_in結(jié)構(gòu) sockaddr_in sin;sin.sin_family = AF_INET;sin.sin_port = htons(8888);sin.sin_addr.S_un.S_addr = INADDR_ANY;// 綁定這個(gè)套節(jié)字到一個(gè)本地地址if(::bind(s, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR){printf("Failed bind() \n");::WSACleanup();return 0;}// 進(jìn)入監(jiān)聽(tīng)模式if(::listen(s, 2) == SOCKET_ERROR){printf("Failed listen()");::WSACleanup();return 0;}// 循環(huán)接受客戶的連接請(qǐng)求 sockaddr_in remoteAddr; int nAddrLen = sizeof(remoteAddr);SOCKET client;char szCmd[32];char szNumRem[32];int i;char block[1024];int BlkSize=0,allNum=0;char *allData=NULL;DWORD BmpSize=0;int nSize=0;while(TRUE){// 接受一個(gè)新連接client = ::accept(s, (SOCKADDR*)&remoteAddr, &nAddrLen);if(client == INVALID_SOCKET){printf("Failed accept()");continue;}printf("接受到一個(gè)連接:%s \r\n", inet_ntoa(remoteAddr.sin_addr));while(1){printf("請(qǐng)輸入命令:\n");scanf("%s",szCmd);//分析命令if(0!=strcmp(szCmd,"q")) //如果不是退出命令,則: {if(0==strcmp(szCmd,"scrshot")) // 如果是截屏命令,則: {// 向客戶端發(fā)送命令,讓其做好準(zhǔn)備::send(client, szCmd, strlen(szCmd), 0);nSize = ::recv(client, szNumRem, 32, 0);if(nSize > 0){szNumRem[nSize]='\0';//解析字符串printf("字符串:%s,大小:%d\n",szNumRem,nSize);stranl(szNumRem);printf("次數(shù):%d,余數(shù):%d\n",num,rem);BmpSize=num*1024+rem;allData = new char[BmpSize];}printf("輸入開(kāi)始命令:");scanf("%s",szCmd);::send(client, szCmd, strlen(szCmd), 0);for(i=0;i<num;i++){BlkSize = ::recv(client, block, 1024, 0);//if(BlkSize==1024)if(1){memcpy(allData+1024*i,block,1024);}else{printf("我擦!\n");system("pause");}}BlkSize = ::recv(client, block, 1024, 0);if(BlkSize==rem){memcpy(allData+1024*i,block,rem);}ofstream of("ClicentScreenShot.bmp",ios_base::binary);of.write(allData,BmpSize);printf("已完全接收?qǐng)D片!\n");}}elsebreak;}// 關(guān)閉同客戶端的連接 ::closesocket(client);}// 關(guān)閉監(jiān)聽(tīng)套節(jié)字 ::closesocket(s);// 釋放WS2_32庫(kù) ::WSACleanup(); return 0; }client:
#include <winsock2.h> // 為了使用Winsock API函數(shù) #include <stdio.h> #include <windows.h> #include<fstream> using namespace std; // 告訴連接器與WS2_32庫(kù)連接 #pragma comment(lib,"WS2_32.lib")char *allData=NULL; DWORD BmpSize=0; int main(int argc, char* argv[]) {// 初始化WS2_32.dll WSADATA wsaData;WORD sockVersion = MAKEWORD(2, 0);::WSAStartup(sockVersion, &wsaData);// 創(chuàng)建套節(jié)字SOCKET s = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if(s == INVALID_SOCKET){printf("Failed socket() \n");::WSACleanup();return 0;}// 也可以在這里調(diào)用bind函數(shù)綁定一個(gè)本地地址// 否則系統(tǒng)將會(huì)自動(dòng)安排// 填寫(xiě)遠(yuǎn)程地址信息 sockaddr_in servAddr; servAddr.sin_family = AF_INET;servAddr.sin_port = htons(8888);// 注意,這里要填寫(xiě)服務(wù)器程序(10ServerDemo程序)所在機(jī)器的IP地址// 如果你的計(jì)算機(jī)沒(méi)有聯(lián)網(wǎng),直接使用127.0.0.1即可servAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");if(::connect(s, (sockaddr*)&servAddr, sizeof(servAddr)) == -1){printf("Failed connect() \n");::WSACleanup();return 0;}// 接收命令char szCmdBuff[32];char str[32];char tmp[16];int i,j;char block[1024];int nRecv = ::recv(s, szCmdBuff, 32, 0);if(nRecv > 0){szCmdBuff[nRecv] = '\0';printf("接收到命令:%s\n", szCmdBuff);}//命令處理if(0==strcmp(szCmdBuff,"scrshot")) {//截屏,并計(jì)算圖像大小 _ScreenSnap();//每次發(fā)送1024字節(jié),計(jì)算發(fā)送次數(shù)及剩余字節(jié)數(shù)//格式: 次數(shù)#余數(shù)DWORD rem=BmpSize%1024;DWORD num=BmpSize/1024;itoa(num,str,10);strcat(str,"#");itoa(rem,tmp,10);strcat(str,tmp);printf("字符串:%s\n",str);::send(s, str, strlen(str), 0);::recv(s, szCmdBuff, 32, 0);if(0==strcmp(szCmdBuff,"start")){for(i=0;i<num;i++){for(j=0;j<1024;j++)block[j]=allData[i*1024+j];::send(s,block,1024,0);}for(j=0;j<rem;j++)block[j]=allData[num*1024+j];::send(s,block,num,0);}}// 關(guān)閉套節(jié)字 ::closesocket(s);// 釋放WS2_32庫(kù) ::WSACleanup(); return 0; }結(jié)果:
轉(zhuǎn)載于:https://www.cnblogs.com/qiangua/p/3670813.html
總結(jié)
- 上一篇: 参考文献标注
- 下一篇: pymongo 使用测试