下面是一个简单阻塞模式的服务器,是一个单对单的服务器如果你想实现多客户端的服务器那就要用到其他的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;
}