导航:首页 > IDC知识 > vc服务器

vc服务器

发布时间:2020-08-12 20:43:23

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
#define WIN32_LEAN_AND_MEAN
#define _WINSOCK_DEPRECATED_NO_WARNINGS

#include <mutex>
#include <thread>
#include <vector>
#include <stdio.h>
#include <tchar.h>
#include <Windows.h>
#include <WinSock2.h>

#pragma comment(lib,"ws2_32.lib")

#define DEFAULT_BUFLEN 512*128
#define MAX_CONNECTIONS 10

class sockServer
{
public:
sockServer(int port, char *(*callback)(void*));
bool sockSetup();
void sockStart();
void sockStop();

~sockServer();

private:
void serverThread();
void messageMonitor();

std::thread clientThread;
std::thread servThread;
std::mutex mutexLock;

SOCKET clientSock[MAX_CONNECTIONS];
SOCKET listenSock;
int connections;
void *recData;
void *senData;

char *(*callback)(void*);
TCHAR errMsg[100];
int iSendResult;
sockaddr_in sai;
HANDLE hMutex;
int iResult;
bool active;
WSADATA wd;
int port;
};

.cpp文件

#include "sockServer.h"

sockServer::sockServer(int port, char *(*callback)(void*))
{
active = false;
connections = 0;
this->port = port;
this->callback = callback;
}

bool sockServer::sockSetup()
{
// Trying to create a Mutex
hMutex = CreateMutex(NULL, TRUE, "{SOCKSERVER-BY-11MOON11}");

// Making sure no other instance of our mutex exists
if (GetLastError() == ERROR_ALREADY_EXISTS)
{
// One instance of our mutex already exists - exiting
printf("CreateMutex failed with error: %d ", GetLastError());
printf("Server is already running! ");

return false;
}

// Setting up Winsock
iResult = WSAStartup(MAKEWORD(1, 1), &wd);
if (iResult != 0)
{
// Error setting up Winsock
_sntprintf_s(errMsg, sizeof(errMsg), "WSAStartup failed with error: %d", iResult);

return false;
}

// Cleaning and setting up Socket Addr Information
ZeroMemory(&sai, sizeof(sai));
sai.sin_family = AF_INET;
sai.sin_addr.s_addr = INADDR_ANY;
sai.sin_port = htons(port);

// Allocating memory for reciving data and creating a socket
recData = (void *)VirtualAlloc(NULL, DEFAULT_BUFLEN, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
listenSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

// Making sure socket started properly
if (listenSock == INVALID_SOCKET)
{
// Error occurred wile staring socket - exiting
printf("Socket failed with error: %ld ", WSAGetLastError());

WSACleanup();
return false;
}

// Binding information and starting listening for connections
bind(listenSock, (sockaddr*)&sai, sizeof(sai));
listen(listenSock, MAX_CONNECTIONS);

// We did it!
printf("Setup() was successfull! ");
return true;
}


void sockServer::sockStart()
{
if (!active)
{
printf("Starting server thread... ");
active = true;
servThread = std::thread(&sockServer::serverThread, this);
}
else
{
printf("Server thread is started already! ");
}
}

void sockServer::sockStop()
{
if (active)
{
printf("Stopping server... ");

active = false;

closesocket(listenSock);

servThread.join();
clientThread.join();

printf("Server is stopped! ");
}
else
{
printf("Server thread is not active! ");
}
}

void sockServer::serverThread()
{
printf("Server thread is now active! ");

clientThread = std::thread(&sockServer::messageMonitor, this);

for (; active == true; Sleep(10))
{
printf("Waiting for a client to connect... ");
clientSock[connections] = accept(listenSock, NULL, NULL);

if (active)
printf("Client #%d has connected! ", connections);

if (clientSock[connections] == INVALID_SOCKET)
{
printf("Accept failed with error: %d ", WSAGetLastError());

shutdown(clientSock[connections], SD_BOTH);
closesocket(listenSock);
WSACleanup();
}

mutexLock.lock();
connections++;
mutexLock.unlock();

// When max limit of clients is reached - exit this loop
if (connections == MAX_CONNECTIONS)
{
break;
}
}
}

void sockServer::messageMonitor()
{
for (; active == true; Sleep(10))
{
for (int i = 0; i < connections; i++)
{
mutexLock.lock();
iResult = recv(clientSock[i], reinterpret_cast<char *>(recData), DEFAULT_BUFLEN, 0);

if (iResult > 0)
{
printf("Bytes received: %d from client #%d ", iResult, i);

senData = callback(recData);

iSendResult = send(clientSock[i], reinterpret_cast<char *>(senData), strlen(reinterpret_cast<char *>(senData)), 0);

if (iSendResult == SOCKET_ERROR)
{
printf("Send to client #%d failed with error: %d ", i, WSAGetLastError());
printf("Closing connection #%d ", i);

shutdown(clientSock[i], SD_SEND);
closesocket(clientSock[i]);
}

printf("Bytes sent: %d ", iSendResult);
}

VirtualFree(senData, 128, MEM_FREE);
memset(recData, 0, sizeof(void*));
memset(senData, 0, sizeof(void*));

mutexLock.unlock();
}
}

mutexLock.lock();
for (int i = 0; i < connections; i++)
{
printf("Closing connection #%d ", i);
shutdown(clientSock[i], SD_SEND);
closesocket(clientSock[i]);
}
mutexLock.unlock();
WSACleanup();
}

sockServer::~sockServer()
{
delete[] &errMsg;
delete[] recData;
delete[] senData;

ReleaseMutex(hMutex);
}

测试:

#define _CRT_SECURE_NO_WARNINGS
#define _WINSOCKAPI_

#include <Windows.h>
#include <iostream>
#include <string>
#include <thread>

#include "sockServer.h"

using namespace std;

void handleServer();

typedef struct _PACKET
{
BYTE Operation;
char Buffer[1024];
}PACKET, *PPACKET;

#define MESSAGE 8

char *serverCallback(void *params)
{
printf("Callback function has been called ");

char *response = (char *)VirtualAlloc(NULL, 64, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);

switch (((PPACKET)params)->Operation)
{

case MESSAGE:
//MessageBox(NULL, ((PPACKET)params)->Buffer, NULL, MB_OK);
strcat(response, "A message has ben displayed!");
break; default:
strcat(response, "Error: Invalid command.");
break;
}

return response;
}

int main()
{
string command;
sockServer sS(65533, &serverCallback);

if (sS.sockSetup())
sS.sockStart();

for (; true; Sleep(10))
{
cin >> command;

if (command == "stop")
{
sS.sockStop();
}
}

return 0;
}

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

与vc服务器相关的知识