TCP Socket服务器编程(C++)

// 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网络编程》(罗莉琴,詹祖桥 主编)(如造成任何不便,请联系我删除)
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值