C 语言 devc++ 使用 winsock 实现 windows UDP 利用 IP 进行局域网发送消息

本文详细介绍了在Windows系统中使用devC++和WinsockAPI实现UDP通信的过程,包括服务端和客户端的代码片段,展示了套接字创建、绑定、发送和接收数据的基本步骤。
摘要由CSDN通过智能技术生成

UDP 通信流程_udp通信过程-CSDN博客参考来源

UDP 通信流程_udp通信过程-CSDN博客

这里移植到windows 上 ,使用 devc++ 开发。 

服务端代码

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <winsock2.h>

int main()
{
	WORD sockVersion = MAKEWORD(2, 2);
	WSADATA data;
	if (WSAStartup(sockVersion, &data) != 0)
	{
		return 0;
	}
	// 1. 创建通信的套接字
	SOCKET fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
	if (fd == INVALID_SOCKET)
	{
		printf("无效的 socket !");
		return 0;
	}

	// 2. 通信的套接字和本地的IP与端口绑定
	struct sockaddr_in addr;
	addr.sin_family = AF_INET;
	addr.sin_port = htons(9999);    // 大端
	addr.sin_addr.s_addr = htonl(INADDR_ANY);  // 0.0.0.0
	int ret = bind(fd, (struct sockaddr*)&addr, sizeof(addr));
	if(ret == -1)
	{
		perror("bind");
		exit(0);
	}

	char buf[1024];
	struct sockaddr_in cliaddr;
	int len = sizeof(cliaddr);
	// 3. 通信
	while(1)
	{
		// 接收数据
		memset(buf, 0, sizeof(buf));
		int rlen = recvfrom(fd, buf, sizeof(buf), 0, (struct sockaddr*)&cliaddr, &len);
		printf("客户端的IP地址: %s, 端口: %d\n",
		       inet_ntoa(cliaddr.sin_addr),
		       ntohs(cliaddr.sin_port));
		printf("客户端say: %s\n", buf);

		// 回复数据
		// 数据回复给了发送数据的客户端
		sendto(fd, buf, rlen, 0, (struct sockaddr*)&cliaddr, sizeof(cliaddr));
	}

	close(fd);

	return 0;
}

客户端代码

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <winsock2.h>

int main()
{
	WORD sockVersion = MAKEWORD(2, 2);
	WSADATA data;
	if (WSAStartup(sockVersion, &data) != 0)
	{
		return 0;
	}
	// 1. 创建通信的套接字
	SOCKET fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
	if (fd == INVALID_SOCKET)
	{
		printf("无效的 socket !");
		return 0;
	}

	// 2. 通信的套接字和本地的IP与端口绑定
	struct sockaddr_in addr;
	addr.sin_family = AF_INET;
	addr.sin_port = htons(9999);    // 大端
//	addr.sin_addr.s_addr = htonl(INADDR_BROADCAST);  // 255.255.255.255 广播 
	char loa[16] = "127.0.0.1";						// 这是指定 IP发送数据 
	addr.sin_addr.S_un.S_addr = inet_addr(loa);				// 加入指定 IP 


	char buf[1024];
    char ipbuf[64];
    int num = 0;
    // 2. 通信
    while(1)
    {
        sprintf(buf, "hello, udp %d....\n", num++);
        // 发送数据, 数据发送给了服务器
        sendto(fd, buf, strlen(buf)+1, 0, (struct sockaddr*)&addr, sizeof(addr));
 
        // 接收数据
        memset(buf, 0, sizeof(buf));
        recvfrom(fd, buf, sizeof(buf), 0, NULL, NULL);
        printf("服务器say: %s\n", buf);
        sleep(1);
    }
 
    close(fd);
 
    return 0;
}

  • 9
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,以下是一个简单的UDP通信的示例代码,分别实现了客户端和服务端: 客户端代码: ``` #include <stdio.h> #include <stdlib.h> #include <string.h> #include <winsock2.h> #pragma comment(lib, "ws2_32.lib") // 链接winsock2库 int main() { // 初始化Winsock2 WSADATA wsaData; if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) { printf("WSAStartup failed!\n"); return 1; } // 创建socket对象 SOCKET sock = socket(AF_INET, SOCK_DGRAM, 0); if (sock == INVALID_SOCKET) { printf("socket failed!\n"); WSACleanup(); return 1; } // 构造服务端地址 SOCKADDR_IN srvAddr; memset(&srvAddr, 0, sizeof(srvAddr)); // 清零 srvAddr.sin_family = AF_INET; srvAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); // 服务端IP srvAddr.sin_port = htons(8888); // 服务端端口号 // 发送数据 char sendBuf[1024] = "hello, server!"; int ret = sendto(sock, sendBuf, strlen(sendBuf), 0, (SOCKADDR*)&srvAddr, sizeof(srvAddr)); if (ret == SOCKET_ERROR) { printf("sendto failed!\n"); closesocket(sock); WSACleanup(); return 1; } // 关闭socket对象 closesocket(sock); // 清除Winsock2 WSACleanup(); return 0; } ``` 服务端代码: ``` #include <stdio.h> #include <stdlib.h> #include <string.h> #include <winsock2.h> #pragma comment(lib, "ws2_32.lib") // 链接winsock2库 int main() { // 初始化Winsock2 WSADATA wsaData; if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) { printf("WSAStartup failed!\n"); return 1; } // 创建socket对象 SOCKET sock = socket(AF_INET, SOCK_DGRAM, 0); if (sock == INVALID_SOCKET) { printf("socket failed!\n"); WSACleanup(); return 1; } // 绑定socket对象到本地地址和端口号 SOCKADDR_IN localAddr; memset(&localAddr, 0, sizeof(localAddr)); // 清零 localAddr.sin_family = AF_INET; localAddr.sin_addr.s_addr = htonl(INADDR_ANY); localAddr.sin_port = htons(8888); if (bind(sock, (SOCKADDR*)&localAddr, sizeof(localAddr)) == SOCKET_ERROR) { printf("bind failed!\n"); closesocket(sock); WSACleanup(); return 1; } // 接收数据 char recvBuf[1024] = { 0 }; SOCKADDR_IN cliAddr; int cliAddrLen = sizeof(cliAddr); int ret = recvfrom(sock, recvBuf, sizeof(recvBuf) - 1, 0, (SOCKADDR*)&cliAddr, &cliAddrLen); if (ret == SOCKET_ERROR) { printf("recvfrom failed!\n"); closesocket(sock); WSACleanup(); return 1; } // 输出接收到的数据 printf("recvMsg: %s\n", recvBuf); // 关闭socket对象 closesocket(sock); // 清除Winsock2 WSACleanup(); return 0; } ``` 注释解释: 1. `WSAStartup` 函数:Winsock2的初始化函数,用于初始化Winsock2库。 2. `socket` 函数:创建一个socket对象。 3. `SOCKADDR_IN` 结构体:表示一个IPv4的地址和端口号。 4. `inet_addr` 函数:将一个点分十进制的IP地址转换为一个32位的网络字节序整数。 5. `htons` 函数:将一个16位的主机字节序整数转换为网络字节序整数。 6. `sendto` 函数:发送数据到指定的地址。 7. `closesocket` 函数:关闭socket对象。 8. `bind` 函数:将socket对象绑定到一个本地地址和端口号。 9. `recvfrom` 函数:从指定地址接收数据。 10. `INADDR_ANY` 宏:表示任意本地地址。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值