基于UDP协议的Socket网络编程
程序员文章站
2022-07-08 19:42:55
...
一、基于UDP协议的Socket网络编程流程:
采用 UDP 套接字方式实现C/S的通信程序由客户端和服务器端两部分组成。
服务器端进程依次按以下步骤进行:
1) 调用Socket()创建一个数据报套接字;
2) 调用 bind()把服务器地址绑定在该套接字上;
3) 调用recvform()等待客户进程发来的请求,服务器此时处于无限循环状态;
4) 服务进程接收到客户进程所发来的数据报后,进行处理,调用 sendto()将处理结果返回给客户进程,返回状态3) 继续监听;
5) 服务进程调用 close()撤消套接字,终止服务。
客户端进程则按以下步骤进行:
1) 调用Socket ()创建一个数据流套接字;
2) 调用sendto () 向服务器进程发送数据报;
3) 调用recvfrom()等待服务器进程返回该处理结果;
4)客户进程调用close()撤消套接字。
二、代码如下:
服务器端代码:UDP_server.c
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <netinet/in.h>
void main()
{
int sock=socket(PF_INET,SOCK_DGRAM,0);
assert(sock!=-1);
struct sockaddr_in ser,cli;//ser服务端,cli客户端
memset(&ser,0,sizeof(&ser));
ser.sin_family= AF_INET;//地址族
ser.sin_port=htons(6500);//端口号(用户向网络,以short类型)
ser.sin_addr.s_addr=inet_addr("192.168.1.129");//IP地址
//绑定socket
int res=bind(sock,(struct sockaddr*)&ser,sizeof(ser));
assert(res!=-1);
while(1)
{
char buff[128]={0};
int len=sizeof(cli);
recvfrom(sock,buff,127,0,(struct sockaddr*)&cli,&len);
printf("srcaddr:%s,port:%d\n",inet_ntoa(cli.sin_addr),
ntohs(cli.sin_port));
printf("buff:%s\n",buff);
sendto(sock,"OK",2,0,(struct sockaddr*)&cli,len);
}
close(sock);
}
客户端代码UDP_client.c
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <netinet/in.h>
void main()
{
int sock=socket(PF_INET,SOCK_DGRAM,0);//第一个参数告诉系统使用哪个底层协议族,对于tcp协议来说,一般设置为PF—INET表示IPv4,PF—INET6表示IPv6;第二个参数表示服务类型为流服务,第三个参数表示默认协议,一般为0;
assert(sock!=-1);
struct sockaddr_in ser,cli;//ser服务端,cli客户端
memset(&ser,0,sizeof(&ser));
ser.sin_family= AF_INET;//地址族
ser.sin_port=htons(6500);//端口号(用户向网络,以short类型)
ser.sin_addr.s_addr=inet_addr("192.168.1.129");//IP地址
while(1)
{
printf("please input: "),fflush(stdout);
char buff[128]={0};
fgets(buff,128,stdin);
buff[strlen(buff)-1]=0;
int len=sizeof(cli);
sendto(sock,"OK",strlen(buff),0,(struct sockaddr*)&ser,sizeof(ser));
memset(buff,0,128);
recvfrom(sock,buff,127,0,NULL,NULL);
printf("%s\n",buff);
}
close(sock);
}