#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <netinet/in.h>
int CreateUdpSocket(struct sockaddr_in *ptLocalAddress,
unsigned int dwSndBuf, /*发送缓冲长度*/
unsigned int dwRcvBuf, /*接收缓冲长度*/
unsigned int dwReuseAddr, /*0表示不可重用, 1表示可以重用*/
unsigned int dwNBIO /*0表示no block io, 1表示block io*/
)
{
int n32Socket = 0;
int n32Ret;
/*建立socket*/
n32Socket = socket(AF_INET,SOCK_DGRAM,0);
if (n32Socket == -1)
{
printf("CreateUdpSocket Error! errno=[%d:%s]\n", errno,strerror(errno));
return -1;
}
/*设置发送与接收缓存*/
n32Ret = setsockopt(n32Socket,SOL_SOCKET,SO_SNDBUF, (unsigned char *)(&dwSndBuf), sizeof(dwSndBuf));
if (n32Ret == -1)
{
printf("setsockopt SO_SNDBUF Error! n32Socket=[%d],errno=[%d:%s]\n", n32Socket, errno,strerror(errno));
goto err;
}
n32Ret = setsockopt(n32Socket,SOL_SOCKET,SO_RCVBUF,(unsigned char *)(&dwRcvBuf),sizeof(dwRcvBuf));
if (n32Ret == -1)
{
printf("setsockopt SO_RCVBUF Error! n32Socket=[%d],errno=[%d:%s]\n", n32Socket, errno,strerror(errno));
goto err;
}
/*允许重用端口*/
n32Ret = setsockopt(n32Socket,SOL_SOCKET,SO_REUSEADDR,(unsigned char *)(&dwReuseAddr),sizeof(dwReuseAddr));
if (n32Ret == -1)
{
printf("setsockopt SO_REUSEADDR Error! n32Socket=[%d], errno=[%d:%s]\n", n32Socket, errno,strerror(errno));
goto err;
}
n32Ret = bind(n32Socket,(struct sockaddr *)ptLocalAddress,sizeof(struct sockaddr));
if (n32Ret == -1)
{
printf("bind Error! n32Socket=[%d], errno=[%d:%s]\n", n32Socket, errno,strerror(errno));
goto err;
}
/*set not block io*/
n32Ret = ioctl(n32Socket,(int)FIONBIO, (unsigned long)&dwNBIO);
if (n32Ret == -1)
{
printf("ioctlsocket Error! n32Socket=[%d], errno=[%d:%s]\n", n32Socket, errno,strerror(errno));
goto err;
}
return n32Socket;
err:
close(n32Socket);
return -1;
}
int Createfd()
{
int fd;
struct sockaddr_in saddr;
bzero(&saddr,sizeof(saddr));
saddr.sin_family = AF_INET;
saddr.sin_addr.s_addr = htonl(INADDR_ANY);
saddr.sin_port = htons(9999);
fd = CreateUdpSocket(&saddr,32000,32000,1,1);
return fd;
}
int UdpSender()
{
char buffer[256] = "1";
struct sockaddr_in saddr;
int sockfd;
bzero(&saddr,sizeof(saddr));
saddr.sin_family = AF_INET;
saddr.sin_addr.s_addr = inet_addr("127.0.0.1");
saddr.sin_port = htons(9999);
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
sendto(sockfd, buffer, strlen(buffer), 0, (struct sockaddr *)&saddr,
sizeof(struct sockaddr_in));
return 0;
}
int UdpRecver(int fd)
{
int iRecvLen;
unsigned char tBuffer[512] ;
struct sockaddr_in tPeerAddr;
unsigned int dwAddrLen ;
dwAddrLen = sizeof(struct sockaddr_in);
memset(&tPeerAddr,0,dwAddrLen);
iRecvLen = recvfrom(fd, tBuffer, 512, 0,
(struct sockaddr *)&tPeerAddr, &dwAddrLen);
if(iRecvLen > 0)
printf("rec(%s)\n",tBuffer);
return iRecvLen;
}