Linux网络编程 UDP套接字编程

本文介绍了一种基于TCP/IP协议的UDP套接字编程方法,并提供了客户端和服务端的具体实现代码,展示了如何进行双向数据交换。

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

使用UDP套接字编程可以实现基于TCP/IP协议中面向无连接的通信,它分为服务器端和客户端2部分,实现流程图如下:


服务器端的实现流程大概如下:

(1)使用socket()创建套接字

(2)为创建的套接字绑定上指定的IP,协议类型,和端口等信息

(3)等待接受客户端的数据请求

(4)处理客户端的数据请求

(5)向客户端发送应答数据

(6)关闭套接字


客户端的实现流程大概如下:

(1)使用socket()函数创建套接字

(2)发送数据给服务器

(3)等待接收服务器的数据应答

(4)关闭套接字


下面直接上代码:

这是客户端的:

#include<stdio.h>
#include<string.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<stdlib.h>
#include<netinet/in.h>
#include<netdb.h>
#include<arpa/inet.h>

#define PORT 1234
#define MAXDATASIZE 200

int main()
{
	int socketID;
	if((socketID = socket(AF_INET,SOCK_DGRAM ,0))==-1){
		printf("socket() error\n");
		return 0;
	}

	sockaddr_in server , to;
	socklen_t len = sizeof(server);
	server.sin_port = PORT;
	server.sin_family = AF_INET;
	server.sin_addr.s_addr = htonl(INADDR_ANY);
     
        to = server;

	while(true){
		char msg[100];
		scanf("%s",msg);
		int h = strlen(msg);
                msg[h] = '\0';
                printf("%s",msg);
		socklen_t sockLen;
		sendto(socketID , msg ,h,0,(struct sockaddr*)&to,sizeof(to));
		recvfrom(socketID, msg , 100, 0 , (struct sockaddr*)&to,&sockLen);
		printf("%s\n", msg);
		printf("%d\n",to.sin_addr.s_addr);
		if(!strcmp(msg,"Finsh!"))break;
	}
	close(socketID);
}
这是服务器的:

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

#define PORT 1234
#define MaxDataSize 200

int main()
{
	int socketID ; 

	if((socketID = socket(AF_INET, SOCK_DGRAM , 0)) == -1){
		printf("socket() error\n");
		return 0;
	}
	printf("socket Create Success : %d\n",socketID );

	//
	sockaddr_in server;
	socklen_t len = sizeof(server);
	server.sin_port = PORT;
	server.sin_family = AF_INET;
	server.sin_addr.s_addr = htonl(INADDR_ANY);

        int opt = SO_REUSEADDR;
	setsockopt(socketID , SOL_SOCKET , SO_REUSEADDR , &opt, sizeof(opt));

	if((bind(socketID , (struct sockaddr *)&server ,sizeof(server)))==-1){
		printf("bind() error\n");
		return 0;
	}
	printf("bind() Success\n");

	char buf[MaxDataSize];
	sockaddr_in from;
	len = sizeof(from);
	while(1)
	{
		int num = recvfrom(socketID ,buf , MaxDataSize ,0,(struct sockaddr*)&from , &len);
                buf[num] = '\0';
		printf("message len : %d\n", num);
		printf("%s\n",buf );
		char  msg[100] = "msg send Success!";
		sendto(socketID , msg , 100,0,(struct sockaddr*)&from ,sizeof(from));
		if(!strcmp(buf , "Finsh !"))break;
	}

	close(socketID);
	printf("Close socket\n");
	return 0;

}
你可以在客户端发送消息给服务器并在服务器端接受
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值