#include
"stdafx.h"
#include
<winsock2.h>
#include
<iostream>
#pragma
comment
(
lib
,
"ws2_32.lib"
)
const
static
int
_MAX_BUF_SIZE
= 256;
using
namespace
std
;
int
_tmain
(
int
argc
,
_TCHAR
*
argv
[])
{
//
初始化
Winsock 2.2
WSADATA
wsaData
;
if
(
WSAStartup
(
MAKEWORD
( 2, 2 ), &
wsaData
) != 0 )
{
cout
<<
"WSAStartup
无法初始化
!"
<<
endl
;
return
-1;
}
//
通过
WinSock
实现网络通信
SOCKET
sServer
;
//
创建用于监听的
Socket
sServer
=
socket
(
AF_INET
,
SOCK_STREAM
,
IPPROTO_TCP
);
if
(
INVALID_SOCKET
==
sServer
)
{
cout
<<
"Socket Failed !"
<<
endl
;
WSACleanup
();
return
-1;
}
//
设置服务器
Socket
地址
SOCKADDR_IN
addrServ
;
addrServ
.
sin_family
=
AF_INET
;
addrServ
.
sin_port
=
htons
( 9990 );
//
服务器端口号
addrServ
.
sin_addr
.
S_un
.
S_addr
=
htonl
(
INADDR_ANY
);
//
绑定
int
retVal
;
retVal
=
bind
(
sServer
, (
const
struct
sockaddr
*)&
addrServ
,
sizeof
(
SOCKADDR_IN
) );
if
(
SOCKET_ERROR
==
retVal
)
{
cout
<<
"bind failed !"
<<
endl
;
closesocket
(
sServer
);
WSACleanup
();
return
-1;
}
//
监听
retVal
=
listen
(
sServer
, 1 );
if
(
SOCKET_ERROR
==
retVal
)
{
cout
<<
"listen failed !"
<<
endl
;
closesocket
(
sServer
);
WSACleanup
();
return
-1;
}
//
接受来自客户端的请求
SOCKET
sClient
;
cout
<<
"TCP Server Start... ..."
<<
endl
;
sockaddr_in
addrClient
;
int
addrClientlen
=
sizeof
(
addrClient
);
sClient
=
accept
(
sServer
, (
sockaddr
FAR
*)&
addrClient
, &
addrClientlen
);
if
(
INVALID_SOCKET
==
sClient
)
{
cout
<<
"accept failed "
<<
endl
;
closesocket
(
sServer
);
WSACleanup
();
return
-1;
}
//
循环接受客户端数据,直到客户端发送
quit
命令
char
buf
[
_MAX_BUF_SIZE
];
while
(
true
)
{
ZeroMemory
(
buf
,
_MAX_BUF_SIZE
);
retVal
=
recv
(
sClient
,
buf
,
BUFSIZ
, 0 );
if
(
SOCKET_ERROR
==
retVal
)
{
cout
<<
"recv failed !"
<<
endl
;
closesocket
(
sServer
);
closesocket
(
sClient
);
WSACleanup
();
return
-1;
}
//
获取系统的时间
SYSTEMTIME
st
;
GetLocalTime
(&
st
);
char
sDateTime
[30];
sprintf
(
sDateTime
,
"%4d-%2d-%2d %2d:%2d:%2d"
,
st
.
wYear
,
st
.
wMonth
,
st
.
wDay
,
st
.
wHour
,
st
.
wMinute
,
st
.
wSecond
);
cout
<<
sDateTime
<<
" , Recv From Client ["
<<
inet_ntoa
(
addrClient
.
sin_addr
)<<
":"
<<
addrClient
.
sin_port
<<
"]: "
<<
buf
<<
endl
;
if
(
strcmp
(
buf
,
"quit"
) == 0 )
{
retVal
=
send
(
sClient
,
"quit"
,
strlen
(
"quit"
), 0 );
break
;
}
else
{
char
msg
[
_MAX_BUF_SIZE
];
sprintf
(
msg
,
"Message received - %s "
,
buf
);
retVal
=
send
(
sClient
,
msg
,
strlen
(
msg
), 0 );
if
(
SOCKET_ERROR
==
retVal
)
{
cout
<<
"send failed!"
<<
endl
;
closesocket
(
sServer
);
closesocket
(
sClient
);
WSACleanup
();
return
-1;
}
}
}
//
最后做一些清理工作
closesocket
(
sServer
);
closesocket
(
sClient
);
WSACleanup
();
system
(
"pause"
);
return
0;
}