基于UDP协议的回显服务器(含代码)

首先可能需要大家看一些预备知识(包括一些要用到的接口);当然也可以不看,当我的建议是最好呢看一下

https://blog.csdn.net/a15929748502/article/details/80400341

 

首先认识UDP协议
此处我们先对UDP有 个直观的认识后 ,我们再详细讨论

    传输层协议
    无连接
    不可靠传输
     面向数据报

其次我们要知道服务器和客户端是怎么运行起来的

服务器

1创建socket

2绑定端口

3循环的读取数据

4针对读取到的数据进行计算和处理

5把处理后的结果发回客户端

 

 

客户端

1创建socket文件

2给服务器发送请求

3从服务器中读取结果。

 

 

理解之后只需要把文字翻译成代码就好了,以下是我翻译的代码

服务器

 
[root@localhost UCP]# vim server.c

#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <sys/types.h>
#include <string.h>
int main(int argc ,char**argv)
{
int sock=socket(AF_INET,SOCK_DGRAM,0);//创建socket
struct sockaddr_in local;

if (sock<0){
perror("socket");
return 1;
}


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 1;
}
创建socket
struct sockaddr_in local;

if (sock<0){
perror("socket");
return 1;
}


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 1;
}
char buf[1024];
struct sockaddr_in client ;


while(1)//循环接受并发送
{
socklen_t len=sizeof (client);
ssize_t s=recvfrom(sock,buf,sizeof(buf)-1,0,(struct sockaddr*)&client,&len);
if (s>0){
buf[s]=0;
printf ("[%s:%d];%s\n",inet_ntoa(client.sin_addr),ntohs(client.sin_port),buf);
sendto(sock,buf,strlen(buf),0,(struct sockaddr*)&client,len);
}
}
return 0;
}


"server.c" 50L, 843C                                                                                                     


"server.c" 50L, 843C                                                                                                     

 

客户端

#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>
#include <string.h>
int main(int argc ,char**argv)
{
int sock=socket(AF_INET,SOCK_DGRAM,0);//创建socket文件
struct sockaddr_in server;


if (sock<0){
perror("socket");
return 1;
}




server.sin_family=AF_INET;
server.sin_port=htons(atoi(argv[2]));
server.sin_addr.s_addr= inet_addr(argv[1]);


char buf[1024];
struct sockaddr_in peer ;


while(1)
{
socklen_t len=sizeof (peer);
printf ("please enter#”);#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>
#include <string.h>
int main(int argc ,char**argv)
{
int sock=socket(AF_INET,SOCK_DGRAM,0);//创建socket文件
struct sockaddr_in server;


if (sock<0){
perror("socket");
return 1;
}




server.sin_family=AF_INET;
server.sin_port=htons(atoi(argv[2]));
server.sin_addr.s_addr= inet_addr(argv[1]);


char buf[1024];
struct sockaddr_in peer ;


while(1)
{
socklen_t len=sizeof (peer);
printf ("please enter#”);

 

<span style="color:#333333">fflush(stdout);
ssize_t s=read(0,buf,sizeof(buf)-1);

if (s>0){
buf[s-1]=0;
sendto(sock,buf,strlen(buf),0,(struct sockaddr*)&server,len);
ssize_t _s=recvfrom(sock,buf,strlen(buf),0,(struct sockaddr*)&peer,&len);
if(_s>0)
buf[_s]=0;
printf ("server echo# %s\n",buf);
}
}
return 0;
}</span>
<span style="color:#cc0000">//注意客户端不用绑定端口,由操作系统分配。//服务器端1025-65535端口号可以自己指定,但1-1025预留给操作系统</span>

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值