[嵌入式应用程序]linux下最简单的socket编程(2)----基于udp的

本文提供了一个完整的UDP通信案例,包括客户端和服务端的C语言程序代码。客户端通过指定IP地址连接到服务端并发送消息,服务端接收消息后原样返回。通过交叉编译,程序可在不同平台上运行。

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

1.客户端的程序client.c:

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

#define BUFFER 800
#define SERV_PORT 3333
//=====================================================================================
//=====================================================================================
int main(int argc, char **argv)
{
int sockfd;
socklen_t src_len;
socklen_t len;
struct sockaddr_in dest_addr;
char send_msg[BUFFER]="I am UDP!", rece_msg[BUFFER];
/* check args */
if(argc != 2)
{
    printf("usage: udpclient <IPaddress>/n");
    exit(1);
}
if((sockfd=socket(AF_INET,SOCK_DGRAM,0))==-1)
    {
     perror("socket creat failed!/n");
     exit(1);
 }
/* init servaddr */
bzero(&dest_addr, sizeof(dest_addr));
dest_addr.sin_family = AF_INET;
dest_addr.sin_port = htons(SERV_PORT);
if(inet_aton(argv[1], &dest_addr.sin_addr) < 0)
{
    printf("[%s] is not a valid IPaddress/n", argv[1]);
    exit(1);
}

if(connect(sockfd, (struct sockaddr *)&dest_addr, sizeof(dest_addr)) == -1)
{
    perror("connect error!/n");
    exit(1);
}

len = strlen(send_msg);
if(sendto(sockfd, send_msg, len, 0, (struct sockaddr *)&dest_addr, sizeof(struct sockaddr_in)) < 0)
{
    perror("sendto error!/n");
 exit(1);
}
src_len = sizeof(dest_addr);
if(recvfrom(sockfd, rece_msg, len, 0, (struct sockaddr *)&dest_addr, &src_len) < 0)
 {
  perror("receive error!/n");
  exit(0);
 }
printf("%s/n",rece_msg);
return 0;
}

2.服务器端的程序server.c:

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

#define BUFFER 800
#define SERV_PORT 3333

int main()
{
int sockfd,n;
socklen_t len;
socklen_t src_len;
struct sockaddr_in servaddr, cliaddr;
char msg[BUFFER];
sockfd = socket(AF_INET, SOCK_DGRAM, 0); /* create a socket */

/* init servaddr */
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(SERV_PORT);

/* bind address and port to socket */
if(bind(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) == -1)
{
    perror("bind error");
    exit(1);
}
src_len = sizeof(cliaddr);
while(1)
{
    if(recvfrom(sockfd, msg, BUFFER, 0, (struct sockaddr *)&cliaddr, &src_len)< 0)
    {
     perror("receive error!/n");
     exit(0);
    }
    len = strlen(msg);
    if(sendto(sockfd, msg, len, 0, (struct sockaddr *)&cliaddr, sizeof(struct sockaddr)) < 0)
    {
     perror("sendto error!/n");
     exit(1);
    }
}
return 0;
}

3.交叉编译服务器端的程序:arm-linux-gcc -o client client.c

   把生成的client放到开发板上

4.本地编译客户端的程序:gcc -o server server.c

  两者就可以通信了,当然也可以反过来,本地当服务器端,开发板当客户机端

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值