TCP套接字服务端

#pragma comment(lib,"ws2_32.lib")//windows套接字动态链接库

#include <stdio.h>
#include <stdlib.h>
#include <Winsock2.h>//windows套接字头文件

void main(void)
{
	WSADATA wsaData;//WSAStartup函数调用后返回的Windows Sockets数据
	SOCKET ListeningSocket;
	SOCKET NewConnection;
	SOCKADDR_IN ServerAddr;//服务端地址
	SOCKADDR_IN ClientAddr;
	int ClientAddrLen;//客户端地址长度
	int Port = 5150;
	int Ret;
	char DataBuffer[1024];//缓存接收到的信息

	if((Ret=WSAStartup(MAKEWORD(2,2),&wsaData))!=0)//wsastartup()主要就是进行相应的socket库绑定
	{
/*makeword是将两个byte型合并成一个word型,一个在高8位(b),一个在低8位(a), 比如a=2;b=1 
2的二进制是00000010 1的二进制为00000001 B是表示高8位,A表示低8位 合并起来就是 
100000010 
MAKEWORD(1,1)和MAKEWORD(2,2)的区别在于,前者只能一次接收一次,不能马上发送,而后者能。*/
		printf("WSAStartup failed with error %d\n",Ret);
		return ;
	}
	if((ListeningSocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==INVALID_SOCKET)//无效套接字
	{
		printf("WSAStartup failed with error %d\n",Ret);
		return ;
	}
	ServerAddr.sin_family = AF_INET;//IPV4
	ServerAddr.sin_port = htons(Port);//从主机字节顺序转变成网络字节顺序,地址空间存储方式变为高位字节存放在内存的低地址处,大端。
	ServerAddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);//将主机数转换成无符号 长整型 的网络字节顺序
	if(bind(ListeningSocket,(SOCKADDR *)&ServerAddr,sizeof(ServerAddr))==SOCKET_ERROR)
	{
		/*bind函数把一个本地协议地址赋予一个套接字.
		int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);*/
		printf("bind failed with error %d\n",WSAGetLastError());
		closesocket(ListeningSocket);
		WSACleanup();
		return ;
	}
	if(listen(ListeningSocket,5)==SOCKET_ERROR)//最多支持5个客户端同时连接
	{
		printf("bind failed with error %d\n",WSAGetLastError());
		closesocket(ListeningSocket);
		WSACleanup();
		return ;
	}
	printf("we are waiting a connecting on port %d.\n",Port);
	ClientAddrLen = sizeof(SOCKADDR);
	if((NewConnection = accept(ListeningSocket,(SOCKADDR*)&ClientAddr,&ClientAddrLen)) == INVALID_SOCKET)
	{
		printf("accept failed with error %d\n", WSAGetLastError());
		closesocket(ListeningSocket);     
    	WSACleanup();
		return ;
	}
	printf("we successfully got a connection from %s:%d\n", inet_ntoa(ClientAddr.sin_addr),ntohs(ClientAddr.sin_port));
	//将一个网络字节序的IP地址(也就是结构体in_addr类型变量)转化为点分十进制的IP地址(字符串)
	
	closesocket(ListeningSocket);

	if((Ret = recv(NewConnection,DataBuffer, sizeof(DataBuffer),0)) == SOCKET_ERROR)
	{
		printf("recv failed with error %d\n", WSAGetLastError());
		closesocket(NewConnection);     
    	WSACleanup();
		return;
	}

	printf("we successfully received %d bytes. \n", Ret);
	DataBuffer[Ret] = '\0';
	printf("%s\n", DataBuffer);
	closesocket(NewConnection);     
    WSACleanup();

	system("pause");


}

发布了10 篇原创文章 · 获赞 0 · 访问量 2363

猜你喜欢

转载自blog.csdn.net/qq_42250189/article/details/104488894