linux网络编程之udp套接字

时间:2022-12-18 00:23:51

一 .关于udp

1.udp的概述

udp的全称是用户数据报协议,他和tcp协议一样用于处理数据包,是一种无连接面向数据报的传输层协议由于udp不提供对数据的分组,组装和不能对数据进行排序的缺点,导致udp在数据发完之后,不能确认数据是否完全到达但是udp又有着在资源消耗少,传输效率高的优点。由于udp本身的缺点,导致其在网络差的环境下会发生严重丢包现象,故其适用于音频,视频,普通数据的传送,偶尔丢失一个数据包没有关系。比如我们平时使用的QQ就是使用udp传送数据。

2.自己实现udp套接字

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

static void* usage(const char* proc)
{
printf("Usage:%s [local_ip] [local_port]\n",proc);
}

//./tcp_server ip port
int main(int argc,char* argv[] )
{

if(argc!=3)
{
usage(argv[0]);
return 1;
}

int sock = socket(AF_INET,SOCK_DGRAM,0);
if(sock < 0 )
{
perror("socket");
return 2;
}

char buf[1024];
struct sockaddr_in local;
local.sin_family = AF_INET;
local.sin_port = htons(atoi(argv[2]));
local.sin_addr.s_addr = inet_addr(argv[1]);
if(bind(sock,(struct sockaddr*)&local,sizeof(local))<0)
{
perror("bind");
return 3;
}
while(1)
{

struct sockaddr_in client;

socklen_t len = sizeof(client);
// printf("get a new client ,%s:%d\n",inet_ntoa(client.sin_addr),ntohs(client.sin_port));
int r = recvfrom(sock ,buf, sizeof(buf)-1, 0,(struct sockaddr*) &client ,& len);
if(r<0)
{
perror("recvfrom");
return 3;
}
buf[r] = 0;
char send[1024];
printf("%s\n",buf);
int s = sendto(sock, buf,r,0,(struct sockaddr*)&client,len);
if(s < 0 )
{
perror("sentto");
return 4;
}
}
return 0;
}
  • udp_client.c
#include<stdio.h>
#include<stdlib.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<arpa/inet.h>
#include<string.h>
#include <netinet/in.h>

static void* usage(const char* proc)
{
printf("Usage:%s [local_ip] [local_port]\n",proc);
}

//./tcp_server ip port
int main(int argc,char* argv[] )
{

if(argc!=3)
{
usage(argv[0]);
return 1;
}
char buf[1024];
struct sockaddr_in local;
local.sin_family = AF_INET;
local.sin_port = htons(atoi(argv[2]));
local.sin_addr.s_addr = inet_addr(argv[1]);
socklen_t len = sizeof(local);

int sock = socket(AF_INET,SOCK_DGRAM,0);
if(sock < 0 )
{
perror("socket");
return 2;
}
//char * send = "hello";
while(1)
{
printf("Please client enter:\n");
char buf[1024];
fflush(stdout);
ssize_t s = read(0,buf,sizeof(buf)-1);
buf[s]=0;
int s1 = sendto(sock, buf,strlen(buf),0,(struct sockaddr*)&local,len);
if(s1<0)
{
perror("sendto");
return 3;
}
int r = recvfrom(sock ,buf, sizeof(buf)-1, 0,(struct sockaddr*) &local ,& len);
if(r<0)
{
perror("recvfrom");
return 4;
}
buf[r] = 0;
printf("server ehco:%s\n ",buf);
}
return 0;
}
  • 实现结果图
    客户端的结果截图:
    linux网络编程之udp套接字
    服务器端的结果截图
    linux网络编程之udp套接字