EasyTcpServer建立

#define WIN32_LEAN_AND_MEAN   //区别winSock1与WinSock2 区别开包含WinSock2  编译可通过
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include<Windows.h>
#include<WinSock2.h>
#include<stdio.h>
#pragma comment(lib,"ws2_32.lib")  //WSAStartup 是动态库接口使用要加载,在window中这么做,在其他平台是不需要
int main()
{
	//Init socket 在window中必须这么做
	WORD versionRequest = MAKEWORD(2,2);//版本
	//MAKEWORD(1,1)和MAKEWORD(2,2)的区别在于,前者只能一次接收一次,不能马上发送,而后者能
	WSADATA WSAdata;
	WSAStartup(versionRequest, &WSAdata);//初始化sock  

	//建立TCP服务器端
	//创建套接字
	SOCKET sock=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);   //AF_INET--ipv4    SOCK_STREAM 流方式  TCP链接
	
	//bind  用于客户端连接的端口
	sockaddr_in _sin = {};
	_sin.sin_family = AF_INET;
	_sin.sin_port = htons(4567);//host to net short  转化网络字节序
	_sin.sin_addr.S_un.S_addr = INADDR_ANY;//inet_addr("127.0.0.1");//将一个点分十进制的IP转换成一个长整数型数(u_long类型)等同于inet_addr()
	//INADDR_ANY  宏表示:INADDR_ANY就是指定地址为0.0.0.0的地址,这个地址事实上表示不确定地址,或“所有地址”、“任意地址”。
	if (SOCKET_ERROR == bind(sock, (sockaddr*)&_sin, sizeof(_sin)))
	{//绑定失败
		printf("绑定失败");
	}
	else
		printf("绑定成功");
	//Listen 监听网络端口
	if (SOCKET_ERROR == listen(sock, 5))//同时监听5 个
		printf("监听失败");
	else
		printf("监听成功");

	//accept 等待接收客户端连接  
	//接受的是客户端的地址信息
	//第三个参数的值是传回来的值的大小
	//返回值是客户端的socket 套接字
	sockaddr_in _clientSin;//远程客户端地址信息
	SOCKET _clientSock = INVALID_SOCKET;
	int nAddrLen = sizeof(_clientSin);
	char msgbuf[] = "hello ,i am server";
	while (true)
	{
		_clientSock = accept(sock, (sockaddr*)&_clientSin, &nAddrLen);
		if (INVALID_SOCKET == _clientSock)
			printf("接受到无效客户端socket");
		else
			printf("接受到新的客户端 IP=%s\n",inet_ntoa(_clientSin.sin_addr));
		//send
		send(_clientSock, msgbuf, strlen(msgbuf) + 1, 0);
	}
	closesocket(sock);//关闭自身socket 套接字
	WSACleanup();
	return 0;
}
发布了15 篇原创文章 · 获赞 2 · 访问量 1939

猜你喜欢

转载自blog.csdn.net/conimade/article/details/103828652