// TcpServer.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <winsock2.h>
#include <iostream>
#pragma comment(lib,"ws2_32.lib")
#define BUF_SIZE 64 //缓冲区大小
int _tmain(int argc, _TCHAR* argv[])
{
WSADATA wsd;//WSADATA变量,用于初始化Windows Socket
SOCKET sServer;//服务器Socket,用于监听客户端请求
SOCKET sClient;//客户端Socket,用于与客户端的通信
int retVal;//调用各种Socket函数的返回值
char buf[BUF_SIZE];//用于接收客户端数据的缓冲区
//---------初始化Socket-------------------
if (WSAStartup(MAKEWORD(2, 2), &wsd) != 0)
{
printf("WSAStartup failed !\n");
WSACleanup();
return -1;
}
//--------------创建用于监听的Socket----------------------------
sServer = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);//(指定协议的地址家族,指定套接字的类型,套接字使用的协议)
if (INVALID_SOCKET == sServer)
{
printf("socket failed !\n");
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);
//------------绑定Socket Server到本地地址---------------------------------
retVal = bind(sServer, (const struct sockaddr*)&addrServ,sizeof(SOCKADDR_IN));
if (SOCKET_ERROR == retVal)
{
printf("bind failed !\n");
closesocket(sServer);
WSACleanup();
return -1;
}
//------------在Socket Server上进行监听---------------------------------
retVal = listen(sServer,1);
if (SOCKET_ERROR == retVal)
{
printf("listen failed !\n");
closesocket(sServer);
WSACleanup();
return -1;
}
//-----------------接受来自客户端的请求------------------------
printf("TCP Server start ---\n");
SOCKADDR_IN addrClient;
int addrClientlen = sizeof(addrClient);
sClient = accept(sServer,(sockaddr FAR*)&addrClient,&addrClientlen);
if (SOCKET_ERROR == sClient)
{
printf("accept failed !\n");
closesocket(sServer);
WSACleanup();
return -1;
}
//---------循环接收客户端的数据,直到客户端发送quit命令后退出----------------
while (true)
{
ZeroMemory(buf,BUF_SIZE);
retVal = recv(sClient,buf,BUFSIZ,0);
if (SOCKET_ERROR == retVal)
{
printf("recv failed !\n");
closesocket(sServer);
closesocket(sClient);
WSACleanup();
return -1;
}
//--------获取当前系统时间----------------------
SYSTEMTIME st;
GetLocalTime(&st);
char sDateTime[30];
sprintf_s(sDateTime,"%4d-%2d_%2d %2d:%2d:%2d",st.wYear,st.wMonth,st.wDay,st.wHour,st.wMinute,st.wSecond);
//-----------打印输出信息--------------------------------
printf("%s,Recv from Client [%s:%d] : %s\n",sDateTime,inet_ntoa(addrClient.sin_addr),addrClient.sin_port,buf);
if (strcmp(buf, "quit") == 0)
{
retVal = send(sClient,"quit",strlen("quit"),0);
break;
}
else
{
char msg[BUF_SIZE];
sprintf_s(msg,"Message received - %s",buf);
retVal = send(sClient,msg,strlen(msg),0);
if (SOCKET_ERROR == retVal)
{
printf("send failed !\n");
closesocket(sServer);
closesocket(sClient);
WSACleanup();
}
}
}
//-----------释放资源------------------
closesocket(sServer);
closesocket(sClient);
WSACleanup();
system("pause");
return 0;
}
代码来源:《Windows网络编程》(罗莉琴,詹祖桥 主编)(如造成任何不便,请联系我删除)
TCP Socket服务器编程(C++)
最新推荐文章于 2023-10-19 13:41:43 发布