luasocket系列之winsocket基础补充_TcpServerDemo


initsock.h  代码:

//winsocket2头文件,用于使用winsock2网络库
#include <winsock2.h>
#pragma comment(lib, "WS2_32")	// 链接到WS2_32.lib

class CInitSock		
{
public:
	CInitSock(BYTE minorVer = 2, BYTE majorVer = 2)
	{
		// 初始化WS2_32.dll
		WSADATA wsaData;//用于描述winsock2的结构体
		WORD sockVersion = MAKEWORD(minorVer, majorVer);
		if(::WSAStartup(sockVersion, &wsaData) != 0)
		{
			exit(0);
		}
	}
	~CInitSock()
	{	
		::WSACleanup();	
	}
};

TCPServer_Sample.cpp 代码:

//
// TCPServer.cpp文件


#include "InitSock.h"
#include <stdio.h>
using namespace std;
#include "iostream"

int main()
{
	CInitSock initSock;		// 初始化Winsock库
	// 创建套节字
	//AF_INET-The Internet Protocol version 4 (IPv4) address family.
	//SOCK_STREAM-A socket type that provides sequenced, reliable, two-way, connection-based byte streams with an OOB data transmission mechanism. 
	//This socket type uses the Transmission Control Protocol (TCP) for the Internet address family (AF_INET or AF_INET6).
	//IPPROTO_TCP-The Transmission Control Protocol (TCP). This is a possible value when the af parameter is AF_INET or AF_INET6 and the type parameter is SOCK_STREAM.
	SOCKET sListen = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	if(sListen == INVALID_SOCKET)
	{
		printf("Failed socket() \n");
		return 0;
	}
	else
	{
	   //If no error occurs, socket returns a descriptor referencing the new socket. Otherwise, a value of INVALID_SOCKET is returned
		/*
		 * The new type to be used in all
		 * instances which refer to sockets.
		 */
		//typedef UINT_PTR        SOCKET;
		//  typedef _W64 unsigned int UINT_PTR, *PUINT_PTR;  socket套接字实际上为 unsigned int 类型,由网络库生成,标示每一个socket
		cout<<"sListen:"<<sListen<<endl;
	}

	
	// 填充sockaddr_in结构
	sockaddr_in sin;
	sin.sin_family = AF_INET;
	sin.sin_port = htons(4567);
	sin.sin_addr.S_un.S_addr = INADDR_ANY;
	
	// 绑定这个套节字到一个本地地址
	if(::bind(sListen, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR)
	{
		printf("Failed bind() \n");
		return 0;
	}
	
	// 进入监听模式
	if(::listen(sListen, 2) == SOCKET_ERROR)
	{
		printf("Failed listen() \n");
		return 0;
	}
	
	// 循环接受客户的连接请求
	sockaddr_in remoteAddr; 
	int nAddrLen = sizeof(remoteAddr);
	SOCKET sClient;
	char szText[] = " TCP Server Demo! \r\n";
	while(TRUE)
	{
		// 接受一个新连接
		sClient = ::accept(sListen, (SOCKADDR*)&remoteAddr, &nAddrLen);
		if(sClient == INVALID_SOCKET)
		{
			printf("Failed accept()");
			continue;
		}
		else
		{
		    cout<<"sClient:"<<sClient<<endl;
		}
		
		printf(" 接受到一个连接:%s \r\n", inet_ntoa(remoteAddr.sin_addr));

		// 向客户端发送数据
		size_t t =::send(sClient, szText, strlen(szText), 0);
		if(t !=SOCKET_ERROR)
		{
		  //If no buffer space is available within the transport system to hold the data to be transmitted, send will block unless the socket has been placed in nonblocking mode. 
		  cout<<"发送字节数量:"<<t<<endl;
		}
		// 关闭同客户端的连接
		::closesocket(sClient);
	}
		
	// 关闭监听套节字
	::closesocket(sListen);

	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值