Windows socket 通信

本文介绍了一个简单的UDP服务器程序实现,该程序使用Winsock库在Windows环境下搭建服务器,监听特定端口接收客户端消息,并根据不同指令做出响应。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >




#include<WINSOCK2.H>
#include<stdio.h>


#pragma comment(lib,"ws2_32")//#pragma comment( comment-type ,["commentstring"] ) , comment-type是一个预定义的标识符,指定注释的类型,应该是compiler,exestr,lib,linker之一。 , commentstring是一个提供为comment-type提供附加信息的字符串。
							//静态加入一个lib文件也就是库文件ws2_32.lib文件,提供相关API的支持,否则需要动态载入ws2_32.dll。




#define SERVER_PORT 6000
#define MAXBUFLEN 1024


int main()
{
	WORD wVersionRequested;
	WSADATA wsaData;
	wVersionRequested = MAKEWORD(1,1);//返回版本号
	if(WSAStartup(wVersionRequested,&wsaData)!=0)//启动Windows socket ,0 表示成功
	{
		return -1;
	}


	if(LOBYTE(wsaData.wVersion)!=1||HIBYTE(wsaData.wVersion)!=1)//LOWORD()得到一个32bit数的低16bit   HIWORD()得到一个32bit数的高16bit   LOBYTE()得到一个16bit数最低(最右边)那个字节   HIBYTE()得到一个16bit数最高(最左边)那个字节
	{
		WSACleanup();//  终止Winsock 2 DLL (Ws2_32.dll) 的使用.
		return -1;
	}
	SOCKET sockSrv;
	if((sockSrv = socket(AF_INET,SOCK_DGRAM,0))==-1)//int socket(int domain, int type, int protocol); 协议族 AF_INET代表ipv4  socket 类型   协议
	{
		perror("socket");//将上一个函数发生错误的原因输出到标准设备(stderr)。参数 s 所指的字符串会先打印出,后面再加上错误原因字符串
		WSACleanup();
		return -1;
	}


	SOCKADDR_IN addrSrv;
	addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);  //sin_addr是一个联合体,用联合体就可以使用多种方式表示IP地址.一般我们使用其中的最后一种方式,即用无符号长整型数据来表示IP地址.此时,用的是s_nu数据成员,s_un是一个结构体,其中只有一个数据成员,即s_addr.
														//htonl 本函数将一个32位数从主机字节顺序转换成网络字节顺序。
	addrSrv.sin_family = AF_INET;
	addrSrv.sin_port = htons(SERVER_PORT);


	if(bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR))==-1) //int PASCAL FAR bind( SOCKET sockaddr, const struct sockaddr FAR* my_addr,int addrlen); 0 成功 -1 失败
	{
		perror("bind");
		return -1;
	}
	else
		printf("Server started,listening at port %d\n\n",SERVER_PORT);


	SOCKADDR_IN addrClient;
	int len  = sizeof(SOCKADDR);
	char recvBuf[MAXBUFLEN] = {0};
	while(1)
	{
		if(recvfrom(sockSrv,recvBuf,MAXBUFLEN,0,(SOCKADDR*)&addrClient,&len)==-1)
		{
			perror("recvfrom");
			break;
		}
		printf("Client: %s\n",recvBuf);
		if(stricmp(recvBuf,"quit")==0)
			strcpy(recvBuf,"Bye");
		else
			strcpy(recvBuf,"GET");
		printf("Server: %s\n",recvBuf);
		if(sendto(sockSrv,recvBuf,strlen(recvBuf)+1,0,(SOCKADDR*)&addrClient,len)==-1)
		{
			perror("sendto");
			break;
		}
		if(stricmp(recvBuf,"Bye")==0)
			break;
	}
	closesocket(sockSrv);
	WSACleanup();


	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值