如下代码是一个 简单的echo服务器,它示例的一些Winsock函数的用法。
#include
<
iostream
>
using namespace std;
#ifdef WIN32
# include < WinSock2.h >
/// 也可在setting/liker/input/Additional dependencies加入导入库引用
# pragma comment(lib, " ws2_32.lib " )
/// 包含AcceptEx,TransmitFile,DisconnectEx等函数
# include < mswsock.h >
# pragma comment(lib, " Mswsock.lib " )
# define PRINT_SOCKET_ERROR(FUNC)
do
{
cout << "<" << #FUNC << "> Call Error!" << " "
<< "Error Number : " << WSAGetLastError() << endl;
} while ( 0 )
#endif // WIN32
#define PORT 5432
int main( int argc, char * argv[])
{
// = 初始化Lib库
int nRet;
WSAData wsaData;
if ((nRet = WSAStartup(0x0202, &wsaData)) != 0)
{
PRINT_SOCKET_ERROR(WSAStartup);
return -1;
}
// = 设置监听socket句柄
SOCKET hListen;
/// #1
if ((hListen = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
{
PRINT_SOCKET_ERROR(socket);
return -1;
}
/// #2
SOCKADDR_IN hostAddr;
{
u_long nIp = htonl(INADDR_ANY);
{
/// 相关函数示例
char szHostName[256] = {0};
gethostname(szHostName, 256);
hostent* thisHost = gethostbyname(szHostName);
nIp = inet_addr(inet_ntoa(*((in_addr*)thisHost->h_addr_list[0])));
}
hostAddr.sin_family = AF_INET;
hostAddr.sin_port = htons(PORT);
hostAddr.sin_addr.s_addr = nIp;
}
if ((nRet = bind(hListen, (PSOCKADDR)&hostAddr, sizeof(SOCKADDR_IN))) != 0)
{
PRINT_SOCKET_ERROR(bind);
return -1;
}
/// #3
if ((nRet = listen(hListen, 5)) != 0)
{
PRINT_SOCKET_ERROR(listen);
return -1;
}
else
{
cout << "Listening at " << inet_ntoa(hostAddr.sin_addr)
<< ":" << ntohs(hostAddr.sin_port) << endl;
}
// = 处理请求
SOCKET hConnected;
SOCKADDR_IN remoteAddr;
int remote_addr_size = sizeof(SOCKADDR_IN);
if ((hConnected = accept(hListen, (PSOCKADDR)&remoteAddr, &remote_addr_size)) == INVALID_SOCKET)
{
PRINT_SOCKET_ERROR(accept);
return -1;
}
else
{
cout << "Connect from " << inet_ntoa(remoteAddr.sin_addr)
<< ":" << ntohs(remoteAddr.sin_port) << endl;
}
// = 数据收发
do
{
char buffer[1024] = {0};
int recv_bytes = recv(hConnected, buffer, 1024, 0);
if (recv_bytes == -1)
{
PRINT_SOCKET_ERROR(recv);
break;
}
else if (recv_bytes == 0)
{
/// 客户端关闭了链接
cout << "Connection closed from " << inet_ntoa(remoteAddr.sin_addr)
<< ":" << ntohs(remoteAddr.sin_port) << endl;
closesocket(hConnected);
break;
}
else
{
buffer[recv_bytes] = 0;
cout << buffer; cout.flush();
int send_bytes = send(hConnected, buffer, recv_bytes, 0);
if (send_bytes != recv_bytes)
{
cout << "Not send out all data!" << endl;
}
}
} while (1);
closesocket(hListen);
// = 清理Lib库
if (WSACleanup() != 0)
{
PRINT_SOCKET_ERROR(WSACleanup);
return -1;
}
return 0;
} ;
using namespace std;
#ifdef WIN32
# include < WinSock2.h >
/// 也可在setting/liker/input/Additional dependencies加入导入库引用
# pragma comment(lib, " ws2_32.lib " )
/// 包含AcceptEx,TransmitFile,DisconnectEx等函数
# include < mswsock.h >
# pragma comment(lib, " Mswsock.lib " )
# define PRINT_SOCKET_ERROR(FUNC)
do
{
cout << "<" << #FUNC << "> Call Error!" << " "
<< "Error Number : " << WSAGetLastError() << endl;
} while ( 0 )
#endif // WIN32
#define PORT 5432
int main( int argc, char * argv[])
{
// = 初始化Lib库
int nRet;
WSAData wsaData;
if ((nRet = WSAStartup(0x0202, &wsaData)) != 0)
{
PRINT_SOCKET_ERROR(WSAStartup);
return -1;
}
// = 设置监听socket句柄
SOCKET hListen;
/// #1
if ((hListen = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
{
PRINT_SOCKET_ERROR(socket);
return -1;
}
/// #2
SOCKADDR_IN hostAddr;
{
u_long nIp = htonl(INADDR_ANY);
{
/// 相关函数示例
char szHostName[256] = {0};
gethostname(szHostName, 256);
hostent* thisHost = gethostbyname(szHostName);
nIp = inet_addr(inet_ntoa(*((in_addr*)thisHost->h_addr_list[0])));
}
hostAddr.sin_family = AF_INET;
hostAddr.sin_port = htons(PORT);
hostAddr.sin_addr.s_addr = nIp;
}
if ((nRet = bind(hListen, (PSOCKADDR)&hostAddr, sizeof(SOCKADDR_IN))) != 0)
{
PRINT_SOCKET_ERROR(bind);
return -1;
}
/// #3
if ((nRet = listen(hListen, 5)) != 0)
{
PRINT_SOCKET_ERROR(listen);
return -1;
}
else
{
cout << "Listening at " << inet_ntoa(hostAddr.sin_addr)
<< ":" << ntohs(hostAddr.sin_port) << endl;
}
// = 处理请求
SOCKET hConnected;
SOCKADDR_IN remoteAddr;
int remote_addr_size = sizeof(SOCKADDR_IN);
if ((hConnected = accept(hListen, (PSOCKADDR)&remoteAddr, &remote_addr_size)) == INVALID_SOCKET)
{
PRINT_SOCKET_ERROR(accept);
return -1;
}
else
{
cout << "Connect from " << inet_ntoa(remoteAddr.sin_addr)
<< ":" << ntohs(remoteAddr.sin_port) << endl;
}
// = 数据收发
do
{
char buffer[1024] = {0};
int recv_bytes = recv(hConnected, buffer, 1024, 0);
if (recv_bytes == -1)
{
PRINT_SOCKET_ERROR(recv);
break;
}
else if (recv_bytes == 0)
{
/// 客户端关闭了链接
cout << "Connection closed from " << inet_ntoa(remoteAddr.sin_addr)
<< ":" << ntohs(remoteAddr.sin_port) << endl;
closesocket(hConnected);
break;
}
else
{
buffer[recv_bytes] = 0;
cout << buffer; cout.flush();
int send_bytes = send(hConnected, buffer, recv_bytes, 0);
if (send_bytes != recv_bytes)
{
cout << "Not send out all data!" << endl;
}
}
} while (1);
closesocket(hListen);
// = 清理Lib库
if (WSACleanup() != 0)
{
PRINT_SOCKET_ERROR(WSACleanup);
return -1;
}
return 0;
} ;