#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;
}
EasyTcpServer建立
猜你喜欢
转载自blog.csdn.net/conimade/article/details/103828652
今日推荐
周排行