1、安裝VC 6.0 時選擇伺服器組件的問題
無需安裝
Launch BackOffice Installation Wizard 中是一些數據服務組件,比如 SQL Server Debugging、MS Data Access Components、Visual InterDev Server等
Visual SourceSafe是個版本控制軟體,用來對源代碼進行版本控制。
之所以說無需安裝是因為這些組件中有用的現在系統已經自帶,SourceSafe又早已過時。
2、VC做的客戶端/伺服器程序
不知道你是要代碼呢,還是要思想,這樣的代碼我寫的太多了,網上也太多了,隨便搜索一下,一幫子,VC知識庫上就多的很。。
給你寫點基本思想吧,估計你是不知道雜開始:
正如樓上兄台所說,用socket,
流程是:
服務端:初始化套接字-建立套接字-綁定埠-監聽:
客戶端嘛:就初始化套接字-建立套接字-向伺服器指定的埠發送消息-等待反饋
服務端:服務端接收到消息-處理-向發送客戶端反饋信息
就這么簡單
3、伺服器如何通過vc 啟動客戶端exe工具
TCP、UDP通信協議,兩個程序通信,伺服器程序命令客戶機程序去執行動作
4、VC 客戶端與伺服器問題(麻煩幫忙調一下)
我看了 錯誤 找到了
你的客戶端 錯誤
if (SOCKET_ERROR == (client_d=connect(client_d, (struct sockaddr *)&remote_addr, sin_size)))
connect返回值為0 而你看你 是將我們的 拿來通信的client_d 賦0 你說怎麼會對
改
if (0!=connect(client_d, (struct sockaddr *)&remote_addr, sin_size))
5、啥是伺服器?啥是VC++?啥是虛擬主機?
問題比較多...
一個一個回來,記得要給分喲...
1.vc++
VC++是微軟出得一個IDE(集成開發環境),換句話說,就是使用c++得一個開發平台.有些軟體就是這個編出來得...另外還有VB,VF.只是使用不同語言...
2.伺服器
給你講一個簡單得B/S模式(瀏覽器/伺服器),我們現在翻網頁,就是用得瀏覽器,相當於客戶端,網站那方就相當於伺服器,收集你上傳得一些數據
3.虛擬主機
相當於你做好一個網站後,要對外發布,你得主機不可能24小時開機,這是就要用別人專門提高得業務-虛擬主機.來存放你得網站
以上全是通俗得回答.其他問題給分再說...呵呵~~~
6、用VC++建立一個TCP伺服器,求例子看下
//這個是我自己寫的,用來測試,編譯通過
// t.cpp : 定義控制台應用程序的入口點。
//
#include "stdafx.h"
#include <stdlib.h>
#include <WinSock2.h>
#include <string>
#include <sstream>
#include <memory>
#pragma comment (lib,"ws2_32.lib")
//HANDLE hevent;
DWORD WINAPI acceptpro(LPVOID lp);
DWORD WINAPI recvpro(LPVOID lp);
struct _cinf
{
SOCKET s;
HANDLE hevn;
SOCKADDR_IN saddr;
}cinf;
int flag=0;
CRITICAL_SECTION cc;
int _tmain(int argc, _TCHAR* argv[])
{
cinf.hevn=CreateEvent(NULL,false,false,NULL);
//cinf.hevn=WSACreateEvent();
InitializeCriticalSection(&cc);
WSADATA wsaData;
int err = WSAStartup( MAKEWORD(2,2),&wsaData);
if (err!=0)
{
WSACleanup();
}
SOCKET sListen;
// int a=4;
// int sendBufSize=1024*10;
//
// int fff=setsockopt(sListen,SOL_SOCKET,SO_RCVBUF,(char *)&sendBufSize,a);
// if (SOCKET_ERROR==fff)
// {
//
// cout<<"setsockopt error:"<<WSAGetLastError()<<endl;
//// continue;
// }
SOCKADDR_IN addr;
addr.sin_family=AF_INET;
addr.sin_port=htons(8888);
addr.sin_addr.S_un.S_addr=inet_addr("192.168.232.129");
sListen=socket(AF_INET,SOCK_STREAM,0);
bind(sListen,(sockaddr *)&addr,sizeof(SOCKADDR_IN));
int error=listen(sListen,SOMAXCONN);
if (SOCKET_ERROR ==error)
{
cout<<"listen fail"<<endl;
}
// hevent=CreateEvent(NULL,false,false,NULL);
CreateThread(NULL,0,acceptpro,(LPVOID)&sListen,0,NULL);
char qq;
EnterCriticalSection(&cc);
cout<<" enter q quit "<<endl;
LeaveCriticalSection(&cc);
while(1)
{
cin>>qq;
if (qq=='q')
{
cout<<"結束server"<<endl;
// SetEvent(hevent);
closesocket(sListen);
break;
}
}
system("pause");
return 0;
}
DWORD WINAPI acceptpro(LPVOID lp)
{
EnterCriticalSection(&cc);
cout<<" acceptting "<<endl;
LeaveCriticalSection(&cc);
while(flag==0)
{
SOCKET sListen=*(SOCKET*)lp;
SOCKADDR_IN remoteAddr;
int len=sizeof(SOCKADDR_IN);
SOCKET snew=accept(sListen,(sockaddr *)&remoteAddr,&len);
if (INVALID_SOCKET==snew)
{
cout<<"accept error "<<"退出 accept線程"<<endl;
return 0;
}
// cinf.hevn=recvEvent;
cinf.s=snew;
cinf.saddr=remoteAddr;
WSAEventSelect(cinf.s,cinf.hevn,FD_READ);
//CreateThread(NULL,0,recvpro,(LPVOID)&cinf,0,NULL);
EnterCriticalSection(&cc);
cout<<"新連接,ip:"<<inet_ntoa(*(in_addr*)&(remoteAddr.sin_addr.S_un.S_addr))<<"port:"<<ntohs(remoteAddr.sin_port)<<endl;
LeaveCriticalSection(&cc);
}
}
DWORD WINAPI recvpro(LPVOID lp)
{
EnterCriticalSection(&cc);
cout<<"recv"<<endl;
LeaveCriticalSection(&cc);
while(1)
{
_cinf * minf=(_cinf*)lp;
cout<<"__wait__"<<endl;
DWORD re=WaitForSingleObject(minf->hevn,INFINITE);
//ResetEvent(minf->hevn);
cout<<"__set__"<<endl;
if (0==re)
{
/* char buf[512];
recv(minf->s,buf,512,0);
*/ int a=4;
int recvBufSize=0;
int fff=getsockopt(minf->s,SOL_SOCKET,SO_RCVBUF,(char *)&recvBufSize,&a);
if (SOCKET_ERROR==fff)
{
cout<<"setsockopt error:"<<WSAGetLastError()<<endl;
continue;
}
EnterCriticalSection(&cc);
cout<<" 連接,ip:"<<inet_ntoa(*(in_addr*)&(minf->saddr.sin_addr.S_un.S_addr))<<" port:"<<ntohs(minf->saddr.sin_port)<<" recvBufSize: "<<recvBufSize<<endl;
EnterCriticalSection(&cc);
// WSAEventSelect(minf->s,cinf.hevn,FD_READ);
//WSASetEvent(minf.hevn);
}
else
{
cout<<"re="<<re<<endl;
// cout<<"連接,ip:"<<inet_ntoa(*(in_addr*)&(minf.saddr.sin_addr.S_un.S_addr))<<"port:"<<ntohs(minf.saddr.sin_port)<<"WaitForSingleObject:error "<<endl;
}
}
}
7、vc++6 怎麼編寫SOCKET的伺服器和客戶端 最好都具體步驟
1.簡單伺服器//#include//#pragmacomment(lib,"WS2_32.lib")WSADATAwsd;staticUINTport=%%1;UINTListen(LPVOIDpParam){SOCKETsServer,sClient;charbuf[1024];intretVal;if(WSAStartup(MAKEWORD(2,2),&wsd)!=0){return-1;//失敗}sServer=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);if(INVALID_SOCKET==sServer){WSACleanup();return-1;//創建套接字失敗}SOCKADDR_INaddrServ;addrServ.sin_family=AF_INET;addrServ.sin_port=htons((short)pParam);addrServ.sin_addr.s_addr=INADDR_ANY;retVal=bind(sServer,(LPSOCKADDR)&addrServ,sizeof(SOCKADDR_IN));if(SOCKET_ERROR==retVal){closesocket(sServer);WSACleanup();return-1;//綁定套接字失敗}retVal=listen(sServer,1);if(SOCKET_ERROR==retVal){closesocket(sServer);WSACleanup();return-1;//開始監聽失敗}sockaddr_inaddrClient;intaddrClientlen=sizeof(addrClient);sClient=accept(sServer,(sockaddrFAR*)&addrClient,&addrClientlen);if(INVALID_SOCKET==sClient){closesocket(sServer);WSACleanup();return-1;//開始接受客戶端連接失敗}ZeroMemory(buf,sizeof(buf));retVal=recv(sClient,buf,sizeof(buf),0);if(SOCKET_ERROR==retVal){closesocket(sServer);closesocket(sClient);WSACleanup();return-1;//接收數據失敗}CString%%2(buf);closesocket(sServer);closesocket(sClient);WSACleanup();return0;}CWinThread*pThread=AfxBeginThread(Listen,&port);2.簡單客戶端//#include//#pragmacomment(lib,"WS2_32.lib")WSADATAwsd;SOCKETsHost;SOCKADDR_INservAddr;charbuf[1024];intretVal;if(WSAStartup(MAKEWORD(2,2),&wsd)!=0){return-1;//失敗}sHost=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);if(INVALID_SOCKET==sHost){WSACleanup();return-1;//創建套接字失敗}servAddr.sin_family=AF_INET;servAddr.sin_addr.s_addr=inet_addr(%%3);servAddr.sin_port=htons((short)%%2);intnServAddlen=sizeof(servAddr);retVal=connect(sHost,(LPSOCKADDR)&servAddr,sizeof(servAddr));if(SOCKET_ERROR==retVal){closesocket(sHost);WSACleanup();return-1;//連接伺服器失敗}ZeroMemory(buf,sizeof(buf));strcpy(buf,%%3);retVal=send(sHost,buf,sizeof(buf),0);if(SOCKET_ERROR==retVal){closesocket(sHost);WSACleanup();return-1;//向伺服器發送數據失敗}closesocket(sHost);WSACleanup();3.獲得本機IP//#include//#pragmacomment(lib,"WS2_32.lib")WSADATAwsd;if(WSAStartup(MAKEWORD(2,2),&wsd)!=0){return-1;//失敗}charszHostname[100],szHostaddress[200];if(gethostname(szHostname,sizeof(szHostname))!=SOCKET_ERROR){HOSTENT*pHostEnt=gethostbyname(szHostname);if(pHostEnt!=NULL){sprintf(szHostaddress,"%d.%d.%d.%d",(pHostEnt->h_addr_list[0][0]&0x00ff),(pHostEnt->h_addr_list[0][1]&0x00ff),(pHostEnt->h_addr_list[0][2]&0x00ff),(pHostEnt->h_addr_list[0][3]&0x00ff));}}elsereturn;CString%%1(szHostaddress);4.端對端通信//#include//#pragmacomment(lib,"WS2_32.lib")WSADATAwsd;SOCKETs;charbuf[1024];if(WSAStartup(MAKEWORD(2,2),&wsd)!=0){return-1;//失敗}s=socket(AF_INET,SOCK_DGRAM,0);if(s==INVALID_SOCKET){WSACleanup();return-1;//創建套接字失敗}SOCKADDR_INservAddr;servAddr.sin_family=AF_INET;servAddr.sin_addr.s_addr=inet_addr(%%1);servAddr.sin_port=htons(INADDR_ANY);if(bind(s,(SOCKADDR*)&servAddr,sizeof(SOCKADDR_IN))==SOCKET_ERROR){closesocket(s);WSACleanup();return-1;//綁定套接字失敗}intnServAddrlen=sizeof(servAddr);ZeroMemory(buf,sizeof(buf));if(recvfrom(s,buf,sizeof(buf),0,(SOCKADDR*)&servAddr,&nServAddrlen)==SOCKET_ERROR){closesocket(s);WSACleanup();return-1;//接收數據失敗}CString%%2(buf);ZeroMemory(buf,sizeof(buf));strcpy(buf,%%3);SOCKADDR_INclientAddr;clientAddr.sin_family=AF_INET;clientAddr.sin_addr.s_addr=inet_addr(%%4);clientAddr.sin_port=htons((short)%%5);intnClientlen=sizeof(clientAddr);if(sendto(s,buf,sizeof(buf),0,(SOCKADDR*)&clientAddr,nClientlen)==SOCKET_ERROR){closesocket(s);WSACleanup();return-1;//向伺服器發送數據失敗}closesocket(s);WSACleanup();5.點對點通信//#include//#pragmacomment(lib,"WS2_32.lib")WSADATAwsd;SOCKADDR_INaddrServ,addrServ2;SOCKETsServer,sClient,sHost;intretVal;sockaddr_inaddrClient;charbuf[1024];staticUINTport=%%2;BOOLlistenerRun=TRUE;UINTListen(LPVOIDpParam){addrServ.sin_family=AF_INET;addrServ.sin_port=htons((UINT)pParam);addrServ.sin_addr.s_addr=INADDR_ANY;retVal=bind(sServer,(LPSOCKADDR)&addrServ,sizeof(SOCKADDR_IN));if(SOCKET_ERROR==retVal){closesocket(sServer);WSACleanup();return-1;//綁定套接字失敗}retVal=listen(sServer,1);if(SOCKET_ERROR==retVal){closesocket(sServer);WSACleanup();return-1;//開始監聽失敗}intaddrClientlen=sizeof(addrClient);sClient=accept(sServer,(sockaddrFAR*)&addrClient,&addClientlen);if(INVALID_SOCKET==sClient){closesocket(sServer);WSACleanup();return-1;//接收客戶端請求失敗}while(listenerRun){ZeroMemory(buf,sizeof(buf));retVal=recv(sClient,buf,sizeof(buf));if(SOCKET_ERROR==retVal){closesocket(sServer);closesocket(sClient);WSACleanup();return-1;//接收客戶端數據失敗}CString%%4(buf);}}if(WSAStartup(MAKEWORD(2,2),&wsd)!=0){return-1;//失敗}sServer=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);if(INVALID_SOCKET==sServer){WSACleanup();return-1;//創建套接字失敗}CWinThread*pThread=AfxBeginThread(Listen,&port);sHost=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);if(INVALID_SOCKET==sHost){WSACleanup();return-1;//創建套接字失敗}servAddr2.sin_family=AF_INET;servAddr2.sin_addr.s_addr=inet_addr(%%1);servAddr.sin_port=htons((short)%%3);intnServerAddrlen=sizeof(servAddr2);retVal=connect(sHost,(LPSOCKADDR)&servAddr2,sizeof(servAddr2));if(SOCKET_ERROR==retVal){closesocket(sHost);WSACleanup();return-1;//連接失敗}zeroMemory(buf,sizeof(buf));strcpy(buf,%%5);retVal=send(sHost,buf,sizeof(buf),0);if(SOCKET_ERROR==retVal){closesocket(sHost);WSACleanup();return-1;//向發送數據失敗}listenerRun=FALSE;DWORDdwExitCode;::GetExitCodeThread(pThread->m_hThread,&dwExitCode);pThread=null;closesocket(sServer);closesocket(sClient);closesocket(sHost);WSACleanup();
8、怎麼樣通過VC++實現TCP伺服器
.h文件
#pragma once.cpp文件
#include "sockServer.h"測試:
#define _CRT_SECURE_NO_WARNINGS9、VC的Web伺服器源碼誰有?
下面我們看一個簡單的Web伺服器代碼示例,它的作用就是響應web瀏覽器的請求,然後返回一個簡單的HTTP內容。 Code #include "stdafx.h" #include <stdio.h> #include <winsock2.h> #pragma comment(lib, "ws2_32") int main(int argc, char* argv[]) { WSADATA ws; ::WSAStartup(MAKEWORD(2,0), &ws); sockaddr_in sockaddr; sockaddr.sin_family = AF_INET; sockaddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); sockaddr.sin_port = htons(9000); SOCKET hSocket = socket(AF_INET, SOCK_STREAM, 0); if(hSocket == INVALID_SOCKET) return WSAGetLastError() ; int ret = bind(hSocket, (LPSOCKADDR)&sockaddr, sizeof(sockaddr)); if (ret == SOCKET_ERROR) { return WSAGetLastError() ; } ret = listen(hSocket, 5); while (true) { SOCKET newSocket = accept(hSocket, NULL, NULL); char content[] = "<head><head><title>index.html </title></head><body>hello world!</body>"; char response[512]; sprintf(response, "HTTP/1.1 200 OK\r \nContent-Type: text/html\r\nContent-Length: %d\r\n\r\n%s", strlen(content), content); send(newSocket, response, sizeof(response), 0); closesocket(newSocket); } ::WSACleanup(); return 0; } 這就是用Socket API構建的一個最簡單的Console 形式的web伺服器。我們來仔細分析一下這段代碼,然後一些基本的 Socket API用法。 #include <winsock2.h> #pragma comment(lib, "ws2_32") 這兩段代碼的意思是:包含windows Socket 頭文件,把ws2_32.lib 庫文件鏈接到項目中來。 WSADATA ws; ::WSAStartup(MAKEWORD(2,0), &ws); 該函數的第一個參數指明程序請求使用的Socket版本,其中高位位元組 指明副版本、低位位元組指明主版本;操作系統利用第二個參數返回請求的Socket的版本信息。當一個應用程序調用WSAStartup函數時,操作系統根 據請求的Socket版本來搜索相應的Socket庫,然後綁定找到的Socket庫到該應用程序中。以後應用程序就可以調用所請求的Socket庫中的 其它Socket函數了。該函數執行成功後返回0。 sockaddr_in sockaddr; sockaddr.sin_family = AF_INET; sockaddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); sockaddr.sin_port = htons(9000); sockaddr_in 數據類型是系統定義的用於表示一個唯一的網路地址。sockaddr.sin_family :指代協議族,在socket編程中只能是AF_INET。 sockaddr.sin_addr.S_un.S_addr: 存放IP地址。 sockaddr.sin_port:存放埠號。 通過IP和埠就可以唯一確定某端的位置。 SOCKET hSocket = socket(AF_INET, SOCK_STREAM, 0); if(hSocket == INVALID_SOCKET) return WSAGetLastError() ; int ret = bind(hSocket, (LPSOCKADDR)&sockaddr, sizeof(sockaddr)); if (ret == SOCKET_ERROR) { return WSAGetLastError() ; } ret = listen(hSocket, 5); 這段代碼的作用就是實例化socket 對象,緊接著把上面初始化的地址數據綁定到這個socket對象。然後調用監聽方法,等待客戶方的連接。 while (true) { SOCKET newSocket = accept(hSocket, NULL, NULL); char content[] = "<head><head><title>index.html </title></head><body>hello world!</body>"; char response[512]; sprintf(response, "HTTP/1.1 200 OK\r \nContent-Type: text/html\r\nContent-Length: %d\r\n\r\n%s", strlen(content), content); send(newSocket, response, sizeof(response), 0); closesocket(newSocket); } 這個無限循環負責接收客戶連接。當新連接到來時,accept方法會返回一個新的socket句柄,有了這個socket句柄就可以往客戶端接收和發送數據。注意:當沒有連接進來是,accept方法會一直阻塞。即:代碼執行到accept方法時,會一直等待客戶連接進來。上面這種是最簡單的I/O埠模型:同步阻塞模型。(網路數據操作也是I/O的一種),但作為web伺服器程序,面對的連接數通常比較多,用這種方法去處理大量的I/O請求,顯然系統的性能和效率上是不可接受的。