linux下UDP的socket编程

本文介绍了一个简单的UDP客户端和服务器程序实现,通过sendto和recvfrom函数进行消息发送与接收。客户端可以向服务器发送多条消息,并最终发送停止信号结束会话,服务器则接收并打印这些消息。

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

自己实现了一下,主要是使用了sendto函数和recvfrom函数;

另外recvfrom和recv最主要的区别是可以得到发送端的地址。

下次接着准备实现一下ftp:

发送端:

#include <stdio.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <string.h>
#include <netinet/in.h>

#define PORT 6789
#define Buflen 100
#define Maxiter 20

int main()
{
	struct sockaddr_in send_addr;
	int sockfd, i;
	char content[Buflen], server_ip[Buflen];
	ssize_t send_size;	

	sockfd = socket(AF_INET, SOCK_DGRAM, 0);
	if(sockfd < 0){
		printf("socket create error\n");
		return -1;
	}

	send_addr.sin_port = htons(PORT);
	send_addr.sin_family = AF_INET;
	send_addr.sin_addr.s_addr = htonl(INADDR_ANY);
	
	printf("please input dest ip:\n");
	read(0, server_ip, Buflen);
	send_addr.sin_addr.s_addr = inet_addr(server_ip);
	
	for(i = 0; i < Maxiter; i ++){
		printf("please input the send message(not more than 100bytes):\n");
		read(0, content, Buflen);
		send_size = sendto(sockfd, content, Buflen, 0, (struct sockaddr *)&send_addr, sizeof(struct sockaddr));
		if(send_size < 0){
			printf("error! %d iters\n", i);
			return -1;
		} 
	}
	send_size = sendto(sockfd, "stop", 5, 0, (struct sockaddr *)&send_addr,sizeof(struct sockaddr));
	if(send_size < 0){
		printf("error!\n");
		return -1;
	}	
	close(sockfd);
	return 0;
}



接收端:

#include <stdio.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <string.h>
#include <netinet/in.h>
#include <stdlib.h>

#define PORT 6789
#define Buflen 100

int main()
{
	struct sockaddr_in send_addr, recv_addr;
	int sockfd, bind_err;
	ssize_t recv_size;
	char content[Buflen];

	sockfd = socket(AF_INET, SOCK_DGRAM, 0);
	if(sockfd < 0){
		printf("socket create error!\n");
		return -1;
	}
	
	recv_addr.sin_port = htons(PORT);
	recv_addr.sin_family = AF_INET;
	recv_addr.sin_addr.s_addr = htonl(INADDR_ANY);

	bind_err = bind(sockfd, (struct sockaddr *)&recv_addr, sizeof(struct sockaddr));
	if(bind_err < 0){
		printf("bind error!\n");
		return;
	}

	while(1){
		memset(&send_addr, 0, sizeof(send_addr));
		socklen_t buflen = sizeof(struct sockaddr);
		recv_size = recvfrom(sockfd, content, Buflen, 0, (struct sockaddr *)&send_addr, &buflen);
		if(recv_size < 0){
			printf("recvfrom error!\n");
			return -1;
		}
		if(strncmp(content, "stop", 4) == 0) break;
		printf("recv : %s\n", content);
	}
	close(sockfd);
	return 0;

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值