UDP编程的服务器端一般步骤是:
1、创建一个socket,用函数socket();
3、绑定IP地址、端口等信息到socket上,用函数bind();
4、循环接收发送数据,用函数recvfrom()、sendto();
5、关闭网络连接;
UDP编程的客户端一般步骤是:
1、创建一个socket,用函数socket();
2、设置对方的IP地址和端口等属性;
3、连接服务器,用函数connect();
若是只是一次发送、接收数据,此函数可不用;
若是循环发送接收,则此处要用connect函数;因为若不用,当sendto()后这时服务器器kill掉,则 client端阻塞在recvfrom处;
4、循环发送接收数据,用函数sendto()、recvfrom();
5、关闭网络连接;
使用C语言,实现过程如下:
UDPServer.c
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <string.h>
#define BUFSIZE 1024
#define ip_address "127.0.0.1"
#define PORT 3000
int main()
{
int sockfd;
int port = PORT;
struct sockaddr_in servaddr,clientaddr;
struct hostent *hostp;
char buf[BUFSIZE];
int res;
//create socket
sockfd =socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
//or sockfd = socket(AF_INET,SOCK_DGRAM,0);
if(sockfd < 0)
printf("errorcreate socket!\n");
//set socket option
int optval = 1;
setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,(constvoid*)&optval,sizeof(int));
//build the server's Internet address
bzero((char *)&servaddr,sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(port);
//bind
if(bind(sockfd,(structsockaddr*)&servaddr,sizeof(servaddr)) < 0)
printf("error on binding!\n");
//recvfrom and sendto in circle
int clientlen = sizeof(clientaddr);
while(1)
{
bzero(buf,BUFSIZE);
res = recvfrom(sockfd,buf,BUFSIZE,0,(structsockaddr*)&clientaddr,&clientlen);
if(res < 0)
{
printf("error in recvfrom!\n");
break;
}
res = sendto(sockfd,buf,strlen(buf),0,(structsockaddr*)&clientaddr,clientlen);
if(res < 0)
{
printf("error in sendto.\n");
break;
}
}
close(sockfd);
}
UDPClient.c
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>
#define BUFSIZE 1024
void error(char* msg)
{
perror(msg);
exit(0);
}
int main()
{
int sockfd;
int port = 3000;
int res;
struct sockaddr_in servaddr;
char buf[BUFSIZE];
//create socket
sockfd = socket(AF_INET,SOCK_DGRAM,0);
if(sockfd < 0)
error("error create socket");
//build the server's Internet address
bzero((char *)&servaddr,sizeof(servaddr));
servaddr.sin_family = AF_INET;
//servaddr.sin_addr = inet_addr("127.0.0.1");
//or inet_aton("127.0.0.1",servaddr.sin_addr.s_addr);
servaddr.sin_port = htons(port);
//get msg from user
bzero(buf,BUFSIZE);
printf("Please enter msg:");
fgets(buf,BUFSIZE,stdin);
//send msg to server
res = sendto(sockfd,buf,strlen(buf),0,(struct sockaddr *)&servaddr,sizeof(servaddr));
if(res < 0)
error("error in sendto");
//print the server's reply
int servaddrlen = sizeof(servaddr);
res = recvfrom(sockfd,buf,strlen(buf),0,(struct sockaddr *)&servaddr,&servaddrlen);
if(res < 0)
error("error in recvfrom");
printf("Echo from server: %s",buf);
return 0;
}