代码如下:
udp_client.c
#include<stdio.h>
#include<netinet/in.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<string.h>
#include<arpa/inet.h>
static void usage(char* proc)
{
printf("usage:%s[serverip][serverport]",proc);
}
int main(int argc,char* argv[])
{
if(argc!=3)
{
usage(argv[0]);
return 1;
}
int sock=socket(AF_INET,SOCK_DGRAM,0);//要注意这里和TCP不同
struct sockaddr_in server_addr;
server_addr.sin_family=AF_INET;
server_addr.sin_port=htons(atoi(argv[2]));
server_addr.sin_addr.s_addr=inet_addr(argv[1]);
char buff[1024];
while(1)
{
printf("client:#");
fflush(stdout);
ssize_t n=read(0,buff,sizeof(buff)-1);
if(n>0)
{
buff[n]='\0';
sendto(sock,buff,strlen(buff),0,(struct sockaddr*)&server_addr,sizeof(server_addr));
ssize_t s=recvfrom(sock,buff,sizeof(buff)-1,0,NULL,NULL);
if(s>0)
printf("server echo:%s",buff);
}
}
close(sock);
return 0;
}
udp_server.c
#include<stdio.h>
#include<netinet/in.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<string.h>
#include<arpa/inet.h>
static void usage(char*proc)
{
printf("usage:%s,[ip][port]",proc);
}
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;
}
struct sockaddr_in server_addr;
server_addr.sin_family=AF_INET;
server_addr.sin_port=htons(atoi(argv[2]));
server_addr.sin_addr.s_addr=inet_addr(argv[1]);
if(bind(sock,(struct sockaddr*)&server_addr,sizeof(server_addr))<0)
{
perror("bind");
return 3;
}
char buff[1024];
struct sockaddr_in client_addr;
socklen_t len=sizeof(server_addr);
while(1)
{
ssize_t recv=recvfrom(sock,buff,sizeof(buff)-1,0,(struct sockaddr*)&client_addr,&len);
if(recv>0)
{
buff[recv]='\0';
printf("client ip:%s,port:%d say:%s",inet_ntoa(client_addr.sin_addr),ntohs(client_addr.sin_port),buff);
sendto(sock,buff,strlen(buff),0,(struct sockaddr*)&client_addr,len);
}
}
close(sock);
return 0;
}
udp和tcp的区别不是很大,如果理解了tcp那么udp也就很容易理解了,关键是要用好sendto和recvfrom两个函数,其他的应该是问题不大。
下面我把这两个函数拿出来大家看一下:
下面是测试udp服务器和客户端:
大致也就这么多了,如果有错误、疑惑请评论