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请求,显然系统的性能和效率上是不可接受的。