導航:首頁 > 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伺服器相關的知識