Linux中使用C语言实现基于UDP协议的Socket通信示例
linux下udp服务器端源码示例:
#include<errno.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<stdlib.h>
#include<string.h>
#include<netinet/in.h>
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/socket.h>
intmain(intargc,char**argv)
{
printf("serverip:%s/n",argv[1]);
printf("serverport:%s/n",argv[2]);
printf("/nservicestarting.../n/n");
intsocketFd;
structsockaddr_insvrAddr;
structsockaddr_inlocalAddr;
socketFd=socket(AF_INET,SOCK_DGRAM,0);
if(-1==socketFd)
{
perror("socket:");
exit(-1);
}
//设置地址可复用
intoption=1;
setsockopt(socketFd,SOL_SOCKET,SO_REUSEADDR,&option,sizeof(option));
//客户端IP
memset(&localAddr,0,sizeof(localAddr));
localAddr.sin_family=AF_INET;
localAddr.sin_addr.s_addr=inet_addr(argv[1]);
localAddr.sin_port=htons(atoi(argv[2]));
intbindResult=bind(socketFd,(structsockaddr*)&localAddr,sizeof(localAddr));
if(-1==bindResult)
{
perror("bind:");
close(socketFd);
exit(-1);
}
//服务器IP
memset(&svrAddr,0,sizeof(svrAddr));
svrAddr.sin_family=AF_INET;
svrAddr.sin_addr.s_addr=inet_addr(argv[1]);
svrAddr.sin_port=htons(atoi(argv[2]));
chartempBuff[2048]={0};
for(;;)
{
//接收数据
structsockaddr_infromAddr;
memset((char*)&fromAddr,0,(int)sizeof(fromAddr));
socklen_tfromLen=sizeof(fromAddr);
ssize_tresult=recvfrom(socketFd,tempBuff,sizeof(tempBuff),0,(structsockaddr*)&fromAddr,&fromLen);
if(-1==result)
{
perror("recvfrom:");
continue;
}
else
{
printf("recvdata%ssuccessed.datalen:%d/n",inet_ntoa(fromAddr.sin_addr),result);
printf("data:/n");
for(inti=0;i<result;i++)
{
printf("%02x",tempBuff[i]);
if((i+1)%16==0)
{
printf("/n");
}
}
printf("/n");
}
//发送数据
result=sendto(socketFd,tempBuff,result,0,(structsockaddr*)&fromAddr,sizeof(fromAddr));
if(-1==result)
{
perror("sendto:");
}
else
{
printf("senddatasuccess.datalen:%d/n",result);
}
sleep(60);
}
close(socketFd);
}
linux下udp客户端源码示例:
#include<errno.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<stdlib.h>
#include<string.h>
#include<netinet/in.h>
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/socket.h>
typedefstruct_NSS_HEADER
{
unsignedshortProtocolVersion;/*协议版本信息*/
unsignedshortMsgType;/*消息类型*/
unsignedshortTransactionNo;/*传输编号*/
unsignedshortPacketLength;/*数据包长度,包括Header*/
}NSS_HEADER;
intmain(intargc,char**argv)
{
printf("clientip:%s/n",argv[1]);
printf("clientport:%s/n",argv[2]);
printf("serverip:%s/n",argv[3]);
printf("serverport:%s/n",argv[4]);
printf("/nservicestarting.../n/n");
intsocketFd;
structsockaddr_insvrAddr;
structsockaddr_inlocalAddr;
socketFd=socket(AF_INET,SOCK_DGRAM,0);
if(-1==socketFd)
{
perror("socket:");
exit(-1);
}
//设置地址可复用
intoption=1;
setsockopt(socketFd,SOL_SOCKET,SO_REUSEADDR,&option,sizeof(option));
//客户端IP
memset(&localAddr,0,sizeof(localAddr));
localAddr.sin_family=AF_INET;
localAddr.sin_addr.s_addr=inet_addr(argv[1]);
localAddr.sin_port=htons(atoi(argv[2]));
intbindResult=bind(socketFd,(structsockaddr*)&localAddr,sizeof(localAddr));
if(-1==bindResult)
{
perror("bind:");
sleep(10);
close(socketFd);
exit(-1);
}
//服务器IP
memset(&svrAddr,0,sizeof(svrAddr));
svrAddr.sin_family=AF_INET;
svrAddr.sin_addr.s_addr=inet_addr(argv[3]);
svrAddr.sin_port=htons(atoi(argv[4]));
chartempBuff[2048]={0};
//每分钟发送一次数据
NSS_HEADERhdr;
memset(&hdr,0,sizeof(NSS_HEADER));
for(;;)
{
//发送数据
hdr.TransactionNo++;
ssize_tresult=sendto(socketFd,&hdr,sizeof(NSS_HEADER),0,(structsockaddr*)&svrAddr,sizeof(svrAddr));
if(-1==result)
{
perror("sendto:");
}
else
{
printf("senddatasuccess.datalen:%d/n",result);
}
//接收数据
structsockaddr_infromAddr;
memset((char*)&fromAddr,0,(int)sizeof(fromAddr));
socklen_tfromLen=sizeof(fromAddr);
result=recvfrom(socketFd,tempBuff,sizeof(tempBuff),0,(structsockaddr*)&fromAddr,&fromLen);
if(-1==result)
{
perror("recvfrom:");
}
else
{
printf("recvdata%ssuccessed.datalen:%d/n",inet_ntoa(fromAddr.sin_addr),result);
printf("data:/n");
for(inti=0;i<result;i++)
{
printf("%02x",tempBuff[i]);
if((i+1)%16==0)
{
printf("/n");
}
}
printf("/n");
}
sleep(60);
}
close(socketFd);
}