Windos下的UPD服务器端的C++实现

UPD服务端的代码,稍微改下参数就可以用了

#include <iostream>
#include <Winsock2.h>
#include <Ws2tcpip.h>
#pragma comment(lib, "Ws2_32.lib")

using namespace std;

/*

UDP server


*/

int main(void)
{
	//1.加载套接字库
	WORD wVersionRequested;
	WSADATA wsaData;
	int err;

	wVersionRequested = MAKEWORD(1, 1);

	err = WSAStartup(wVersionRequested, &wsaData);

	if (err != 0)
	{
		return -1;
	}

	if (LOBYTE(wsaData.wVersion) != 1 ||
		HIBYTE(wsaData.wVersion) != 1)
	{
		WSACleanup();
		return -1;
	}

	//2.创建套接字
	//SOCK_DGRAM 表明要用UDP
	SOCKET sockSrv = socket(AF_INET, SOCK_DGRAM, 0);

	SOCKADDR_IN addrSrv;
	addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
	addrSrv.sin_family = AF_INET;
	addrSrv.sin_port = htons(6000);

	//3.绑定套接字
	bind(sockSrv, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));

	char recvBuf[100];//用来保存接受的信息
	char sendBuf[100];//用来保存发送的信息
	char tempBuf[200];//用来存放中间临时数据
	char str[INET_ADDRSTRLEN];
	SOCKADDR_IN addrClient;
	int len = sizeof(SOCKADDR);

	while (1)
	{
		//4.等待并接收数据
		recvfrom(sockSrv, recvBuf, 100, 0,
			(SOCKADDR*)&addrClient, &len);

		//收到的第一个字符是q表面发送方想退出聊天
		if ('q' == recvBuf[0])  
		{
			sendto(sockSrv, "q", strlen("q") + 1, 0,
				(SOCKADDR*)&addrClient, len);
			cout << "Chat end!" << endl;
			break;
		}

		sprintf_s(tempBuf, 200, "%s say: %s",
			inet_ntop(AF_INET, &addrClient.sin_addr, str, sizeof(str)), len);
		cout << tempBuf << endl;

		//5.发送数据
		cout << "Please input data: " << endl;
		gets_s(sendBuf);
		sendto(sockSrv, sendBuf, strlen(sendBuf) + 1, 0, (SOCKADDR*)&addrClient, len);
	}

	//6.关闭套接字
	closesocket(sockSrv);
	WSACleanup();

	return 0;
}
在C语言中,可以使用UDP协议发送字节。以下是一个简单的示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <arpa/inet.h> #include <netinet/in.h> #define BUF_SIZE 1024 int main(int argc, char *argv[]) { int sockfd; struct sockaddr_in servaddr; char buf[BUF_SIZE]; int bytes_sent; if (argc != 3) { fprintf(stderr, "Usage: %s <IP address> <port>\n", argv[0]); exit(1); } // 创建UDP套接字 if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { perror("socket error"); exit(1); } // 设置服务器地址 memset(&servaddr, 0, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = inet_addr(argv[1]); servaddr.sin_port = htons(atoi(argv[2])); // 发送字节 bytes_sent = sendto(sockfd, buf, strlen(buf), 0, (struct sockaddr *)&servaddr, sizeof(servaddr)); if (bytes_sent < 0) { perror("sendto error"); exit(1); } printf("%d bytes sent.\n", bytes_sent); close(sockfd); return 0; } ``` 在这个示例中,我们使用了`socket`函数创建UDP套接字,然后使用`sendto`函数将字节发送到指定的IP地址和端口号。需要注意的是,`sendto`函数的第二个参数是一个指向要发送的字节的指针,第三个参数是要发送的字节数。在这个示例中,我们使用了`strlen`函数来计算要发送的字节数。你可以根据实际情况修改这个值。 另外,需要注意的是,UDP协议是无连接的,因此你需要在发送之前设置好服务器的地址和端口号。在示例代码中,我们使用了`struct sockaddr_in`结构体来表示服务器地址,其中`s_addr`成员变量是一个32位的IPv4地址。你可以使用`inet_addr`函数将点分十进制的IP地址转换成32位的网络字节序整数。端口号需要使用`htons`函数将主机字节序转换成网络字节序。 希望这个示例对你有所帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

困了就喝白茶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值