UDP接受与发送程序的源码!
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <assert.h>//设定插入点
#include <ctype.h>//字符处理
#include <errno.h>//定义错误码
#include <float.h>//浮点数处理
#include <limits.h>//定义各种数据类型最值常量
#include <locale.h>//定义本地化函数
#include <math.h>//定义数学函数
#include <stdio.h>//定义输入/输出函数
#include <stdlib.h>//定义杂项函数及内存分配函数
#include <time.h>//定义关于时间的函数
#include <wchar.h>//宽字符处理及输入/输出
#include <wctype.h>
#include <libxml/parser.h>
#include <libxml/tree.h>
int create_udp_socket(char *ip, int port){
int onOff = 1;
struct sockaddr_in addr;
memset(&addr,0,sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr(ip);
//addr.sin_addr.s_addr = htonl(INADDR_ANY);
addr.sin_port = htons(port);
int sockfd;
if ((sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1) {
return(-1);
}
//fcntl(sockfd, F_SETFD, FD_CLOEXEC);
//setsockopt(sockfd,SOL_SOCKET, SO_REUSEADDR, (const void *)&onOff, sizeof(onOff));
if (bind(sockfd, (struct sockaddr *)&addr, sizeof(addr)) == -1) {
close(sockfd);
return(-1);
}
return sockfd;
}
void listen_udp(int socket){
socklen_t sin_len;
char msg_buffer[1024*512];
struct sockaddr_in sin;
sin_len=sizeof(sin);
fd_set rfds;
struct timeval tv;
int retval;
int rlen = 0;
int socket_descriptor;
socket_descriptor = socket;
while(1){
FD_ZERO(&rfds);
FD_SET(socket_descriptor, &rfds);
tv.tv_sec = 4;
tv.tv_usec = 0;
printf("before,select\n");
retval = select(socket_descriptor+1, &rfds, NULL, NULL, &tv);
if (retval == -1){
printf("select error %d %s\n",socket_descriptor,strerror(errno));
break;
}
else if (retval){
memset(msg_buffer, 0, 1024*512);
if(FD_ISSET(socket_descriptor, &rfds)){
printf("!!!!!!\n");
rlen = recvfrom(socket_descriptor, msg_buffer, 1024*512, 0, (struct sockaddr *)&sin, &sin_len);
if(rlen > 0){
printf("recv %s \n", msg_buffer);
}
else{
printf("rlen : %d\n", rlen);
}
}
}
}
close(socket_descriptor);
}
int send_message_to_player( const char* ip_address, const unsigned int port, char *info )
{
struct sockaddr_in servaddr;
int sockfd;
printf("send_message_to_player 1: %s\n",ip_address);
if (!ip_address) {
return 1;
}
printf("send_message_to_player 2\n");
sockfd = socket(AF_INET,SOCK_DGRAM, 0);
if (sockfd < 0) {
printf("error opening socket");
return 1;
}
printf("send_message_to_player 3\n");
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = inet_addr(ip_address);
servaddr.sin_port=htons(port);
printf("send_message_to_player 4\n");
sendto(sockfd, info, strlen(info), 0,
(struct sockaddr *)&servaddr, sizeof(servaddr));
sendto(sockfd, info, strlen(info), 0,
(struct sockaddr *)&servaddr, sizeof(servaddr));
sendto(sockfd, info, strlen(info), 0,
(struct sockaddr *)&servaddr, sizeof(servaddr));
sendto(sockfd, info, strlen(info), 0,
(struct sockaddr *)&servaddr, sizeof(servaddr));
printf("send_message_to_player 5\n");
close(sockfd);
return 0;
}
int main(int argc,char *argv[])
{
int socket;
const char* ip_address;
printf("before create_udp_socket\n");
socket = create_udp_socket("0.0.0.0",1000);
printf("after create_udp_socket\n");
if (argc<=1)
{
listen_udp(socket);
}
printf("after listen_udp\n");
if(argc=2)
{
char buf[]="<info title=\"test\"><status>1</status><message>12345</message><info>";
printf("to 172.168.110.34\n");
printf("%s\n",argv[0]);
printf("%s\n",argv[1]);
ip_address=argv[1];
send_message_to_player(ip_address,1000,buf);
}
return 0;
}
在建立makefile文件
makefile-x86
CXX =g++
LIN-DIR=/root/czy/test-c2/test-x86/libxml/libxml2-2.9.0/include
test-x86:receive.cpp
$(CXX) -I$(LIN-DIR) receive.cpp -o test-x86
makefile-c2
CXX = c2-linux-g++
LIN-DIR=/root/czy/test-c2/test-x86/libxml/libxml2-2.9.0/include
test-c2:receive.cpp
$(CXX) -I$(LIN-DIR) receive.cpp -o test-c2