linux下一个UDP通信例子
时间:2010-12-07 来源:ofslinux
前几天写了一个TCP的通信例子,但是有些问题还没有解决,像一建立连接之后,单方中断连接另一方容易陷入无限等待,还有一些缓冲区无法清除造成一端连续发送的现象,这些不是什么大问题,只是TCP本来复杂我不想深入研究了。
今天试着写了UDP的例子,UDP用起来就好得多了。一共两个源文件UDP_sever.c、UDP_client.c。也没有什么特殊功能,就是一个UDP的例子。
1.首先是UDP_server.c里面,用socket()建立一个套接字,然后用bind()把地址端口绑定到这个套接字上面,接着就是开始侦听这个端口。有发送函数、也有接收函数,可以很方便的收发数据。接收到的数据我把ip、端口和信息提取出来了,在终端上显示。
2.UDP_client.c里面,同样建立一个套接字,不用侦听,可以直接向指定IP的端口上发数据,我用了一个while(1)来一直发送,发送内容、ip和端口用参数输入。
代码用gcc编译,测试运行正常。还有一点值得高兴,这些源码用arm-linux-gcc编译了一遍,放在到arm板子上运行正常,和电脑没有一点区别。
附上例子源码,代码简单我就不注解了:
//UDP_server.c
#include <sys/types.h>
#include <sys/socket.h>
#include <linux/in.h>
#include <string.h>
#include <stdio.h>
#define PORT_SERV 8889
#define BUFF_LEN 1024
static void UDP_server_process(int s,struct sockaddr * client)
{
int n,len,PORT_INT,count = 0;
char buff[BUFF_LEN];
char *IP_STR;
struct sockaddr_in *ip;
ip = (struct sockaddr_in *)client;
len = sizeof(*client);
while(1){
n = recvfrom(s,buff,BUFF_LEN,0,client,&len);
IP_STR = (char *)inet_ntoa(ip->sin_addr);
PORT_INT = ntohs(ip->sin_port);
printf("%d Received Address:%s:%d\n",count,IP_STR,PORT_INT);
printf("%d Received Message:%s\n",count++,buff);
printf("\n");
sendto(s,buff,n,0,client,len);
}
}
int main(int argc,char **argv)
{
int s;
struct sockaddr_in addr_serv,addr_clie;
s = socket(AF_INET,SOCK_DGRAM,0);
memset(&addr_serv,0,sizeof(addr_serv));
addr_serv.sin_family = AF_INET;
addr_serv.sin_addr.s_addr = htonl(INADDR_ANY);
addr_serv.sin_port = htons(PORT_SERV);
bind(s,(struct sockaddr *)&addr_serv,sizeof(addr_serv));
UDP_server_process(s,(struct sockaddr*)&addr_clie);
return 0;
}
//UDP_client.c
#include <sys/types.h>
#include <sys/socket.h>
#include <linux/in.h>
#include <string.h>
#include <stdio.h>
#define PORT_SERV 8889
#define BUFF_LEN 1024
#define SERV_IP "192.168.31.34"
static void UDP_client_process(int s,struct sockaddr *to)
{
char RecBuff[BUFF_LEN]="\n",SendBuff[BUFF_LEN];
int n;
struct sockaddr_in from;
int len = sizeof(*to);
printf("please input message!\n");
while(1){
n = read(0,SendBuff,BUFF_LEN);
SendBuff[n++] = '\0';
sendto(s,SendBuff,n,0,to,len);
// recvfrom(s,RecBuff,BUFF_LEN,0,(struct sockaddr*)&from,&len);
// printf("recved:%s\n",RecBuff);
}
}
int main(int argc,char **argv)
{
int s;
struct sockaddr_in addr_serv,addr_clie;
char *msg;
if(argc != 3){
printf("parameter is error!\n");
printf("format:ip port\n");
return -1;
}
s = socket(AF_INET,SOCK_DGRAM,0);
memset(&addr_serv,0,sizeof(addr_clie));
addr_serv.sin_family = AF_INET;
/*inet_addr(SERV_IP);htonl(INADDR_ANY);*/
addr_serv.sin_addr.s_addr = inet_addr(argv[1]);
/*htons(PORT_SERV);*/
addr_serv.sin_port = htons(atoi(argv[2]));
UDP_client_process(s,(struct sockaddr*)&addr_serv);
close(s);
return 0;
}
截个图看看
今天试着写了UDP的例子,UDP用起来就好得多了。一共两个源文件UDP_sever.c、UDP_client.c。也没有什么特殊功能,就是一个UDP的例子。
1.首先是UDP_server.c里面,用socket()建立一个套接字,然后用bind()把地址端口绑定到这个套接字上面,接着就是开始侦听这个端口。有发送函数、也有接收函数,可以很方便的收发数据。接收到的数据我把ip、端口和信息提取出来了,在终端上显示。
2.UDP_client.c里面,同样建立一个套接字,不用侦听,可以直接向指定IP的端口上发数据,我用了一个while(1)来一直发送,发送内容、ip和端口用参数输入。
代码用gcc编译,测试运行正常。还有一点值得高兴,这些源码用arm-linux-gcc编译了一遍,放在到arm板子上运行正常,和电脑没有一点区别。
附上例子源码,代码简单我就不注解了:
//UDP_server.c
#include <sys/types.h>
#include <sys/socket.h>
#include <linux/in.h>
#include <string.h>
#include <stdio.h>
#define PORT_SERV 8889
#define BUFF_LEN 1024
static void UDP_server_process(int s,struct sockaddr * client)
{
int n,len,PORT_INT,count = 0;
char buff[BUFF_LEN];
char *IP_STR;
struct sockaddr_in *ip;
ip = (struct sockaddr_in *)client;
len = sizeof(*client);
while(1){
n = recvfrom(s,buff,BUFF_LEN,0,client,&len);
IP_STR = (char *)inet_ntoa(ip->sin_addr);
PORT_INT = ntohs(ip->sin_port);
printf("%d Received Address:%s:%d\n",count,IP_STR,PORT_INT);
printf("%d Received Message:%s\n",count++,buff);
printf("\n");
sendto(s,buff,n,0,client,len);
}
}
int main(int argc,char **argv)
{
int s;
struct sockaddr_in addr_serv,addr_clie;
s = socket(AF_INET,SOCK_DGRAM,0);
memset(&addr_serv,0,sizeof(addr_serv));
addr_serv.sin_family = AF_INET;
addr_serv.sin_addr.s_addr = htonl(INADDR_ANY);
addr_serv.sin_port = htons(PORT_SERV);
bind(s,(struct sockaddr *)&addr_serv,sizeof(addr_serv));
UDP_server_process(s,(struct sockaddr*)&addr_clie);
return 0;
}
//UDP_client.c
#include <sys/types.h>
#include <sys/socket.h>
#include <linux/in.h>
#include <string.h>
#include <stdio.h>
#define PORT_SERV 8889
#define BUFF_LEN 1024
#define SERV_IP "192.168.31.34"
static void UDP_client_process(int s,struct sockaddr *to)
{
char RecBuff[BUFF_LEN]="\n",SendBuff[BUFF_LEN];
int n;
struct sockaddr_in from;
int len = sizeof(*to);
printf("please input message!\n");
while(1){
n = read(0,SendBuff,BUFF_LEN);
SendBuff[n++] = '\0';
sendto(s,SendBuff,n,0,to,len);
// recvfrom(s,RecBuff,BUFF_LEN,0,(struct sockaddr*)&from,&len);
// printf("recved:%s\n",RecBuff);
}
}
int main(int argc,char **argv)
{
int s;
struct sockaddr_in addr_serv,addr_clie;
char *msg;
if(argc != 3){
printf("parameter is error!\n");
printf("format:ip port\n");
return -1;
}
s = socket(AF_INET,SOCK_DGRAM,0);
memset(&addr_serv,0,sizeof(addr_clie));
addr_serv.sin_family = AF_INET;
/*inet_addr(SERV_IP);htonl(INADDR_ANY);*/
addr_serv.sin_addr.s_addr = inet_addr(argv[1]);
/*htons(PORT_SERV);*/
addr_serv.sin_port = htons(atoi(argv[2]));
UDP_client_process(s,(struct sockaddr*)&addr_serv);
close(s);
return 0;
}
截个图看看
相关阅读 更多 +