下面是一個簡單阻塞模式的伺服器,是一個單對單的伺服器如果你想實現多用戶端的伺服器那就要用到其他的i/o模型了以後再說了!
#include <cstdlib>
#include <iostream>
#include <Winsock2.h>
#pragma comment(lib,"libws2_32.lib")
//緩衝區大小
#define DATA_BUFSIZE 4096
using namespace std;
const unsigned int nPort = 5151;
int main(int argc, char *argv[])
{
WSADATA wsaData;
SOCKET Listen;
SOCKET Accept;
char Buffer[DATA_BUFSIZE];
//初始化Winsock版本2.2
int ret = WSAStartup(MAKEWORD(2,2),&wsaData);
if(ret != 0)
{
//注意:因為Winsock沒有載入,所以我們不能使用WSAGetLastError
//來確定導致故障的特定錯誤。我們只能根據返回狀態判斷
cout<<"WSAStartup failed with error "<<ret<<endl;
WSACleanup();
return 0;
}
//這裡就是我們建立socket要串連或者監聽代碼了
Listen = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
//設定伺服器的SOCKADDR_IN
SOCKADDR_IN ServerDdr;
ServerDdr.sin_family = AF_INET;
ServerDdr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
ServerDdr.sin_port = htons(nPort);
//綁定監聽socket
int nRet = bind(Listen,(LPSOCKADDR)&ServerDdr,sizeof(ServerDdr));
if(nRet == SOCKET_ERROR)
{
cout<<"bind error!"<<endl;
closesocket(Listen);
goto ERROR1;
}
//接受 ,最後連個參數可以為NULL,例如
//Accept = accept(Listen,NULL,NULL);
//如果你想要擷取用戶端的ip就要像下面
SOCKADDR_IN AcceptAddr;
int AcceptAddrLen;
Accept = accept(Listen,(LPSOCKADDR)&AcceptAddr,&AcceptAddrLen);
//列印用戶端的ip和連接埠號碼
cout<<"ip address:"<<inet_ntoa(AcceptAddr.sin_addr)<<endl;
cout<<"Port is:"<<ntohs(AcceptAddr.sin_port)<<endl;
nRet = 0;
while(1)
{
//接收資料
nRet = recv(Accept,Buffer,DATA_BUFSIZE,0);
if(nRet == SOCKET_ERROR )
{
cout<<"recv error!"<<endl;
closesocket(Accept);
closesocket(Listen);
goto ERROR1;
}
}
closesocket(Accept);
closesocket(Listen);
ERROR1:
//如果程式結束調用 WSACleanup
WSACleanup();
system("PAUSE");
return EXIT_SUCCESS;
}