UDP在socket编程中和TCP的不同
UDP是无连接的传输,因此并不需要建立连接,不需要监听是否有客户端发送连接请求(具体到socket编程中即UDP不需要listen()和accept())
UDP采用面向数据报方式(socket()的第二个参数是SOCK_DGRAM)
UDP可能会丢包,也不保证数据顺序性(QQ上有时候消息在发送端和接收端的顺序不一样)
UDP收发数据用sendto/recvfrom函数,每次sendto/recvfrom均需指定地址信息(这一点TCP服务器中在connect/accept时确定)
UDP shutdown函数无效
服务器端程序:
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
void usage(char *proc)
{
printf("%s [ip] [port]\n",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 1;
}
int _port=atoi(argv[2]);
char *_ip=argv[1];
struct sockaddr_in local;
local.sin_family=AF_INET;
local.sin_port=htons(_port);
local.sin_addr.s_addr=inet_addr(_ip);
//绑定
if(bind(sock,(struct sockaddr*)&local,sizeof(local))<0){
perror("bind");
return 2;
}
char buf[1024];
struct sockaddr_in client;
socklen_t client_len;
while(1){
//接收数据
ssize_t _size=recvfrom(sock,buf,sizeof(buf)-1,0,(struct sockaddr*)&client,&client_len);
if(_size<0){
perror("recvfrom");
}else if(_size==0){
printf("client shutdown...\n");
}else{
printf("client# %s",buf);
}
}
return 0;
}客户端程序:
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
void usage(char *proc)
{
printf("%s [ip] [port]\n",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;
}
int _port=atoi(argv[2]);
char *_ip=argv[1];
//remote保存远端服务器的信息
struct sockaddr_in remote;
remote.sin_family=AF_INET;
remote.sin_port=htons(_port);
remote.sin_addr.s_addr=inet_addr(_ip);
socklen_t remote_len=sizeof(remote);
char buf[1024];
while(1){
printf("Please Enter:");
fgets(buf,sizeof(buf),stdin);
//发送数据
ssize_t _size=sendto(sock,buf,sizeof(buf)-1,0,(struct sockaddr*)&remote,remote_len);
if(_size<0){
perror("sendto");
}
}
return 0;
}服务器端运行结果:
运行了3个客户端结果:
本文出自 “零蛋蛋” 博客,请务必保留此出处http://lingdandan.blog.51cto.com/10697032/1782116
原文地址:http://lingdandan.blog.51cto.com/10697032/1782116