23,120
社区成员
发帖
与我相关
我的任务
分享
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <signal.h>
#include <sys/param.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <fcntl.h>
#include <errno.h>
#include <netinet/in.h>
#include <math.h>
int get_internet_address(char* host,int len,int * portp,struct sockaddr_in* addrp);
void say_who_called(struct sockaddr_in* addrp);
void reply_to_sender(int sock,char*msg,struct sockaddr_in *addrp,socklen_t len);
int main(int ac,char*av[])
{
int myport=8786;
char buf[BUFSIZ];
memset(buf,0,sizeof(buf));
int sockid;
struct sockaddr_in my_addr;
struct sockaddr_in their_addr;
int addr_len,numbytes;
if((sockid=socket(AF_INET,SOCK_DGRAM,0))==-1)
{
perror("socket");
exit(1);
}
my_addr.sin_family=AF_INET;
my_addr.sin_port=htons(myport);
my_addr.sin_addr.s_addr=INADDR_ANY;
bzero(&(my_addr.sin_zero),8);
if(bind(sockid,(struct sockaddr*)&my_addr,sizeof(struct sockaddr))== -1 )
{
perror("bind");
exit(1);
}
fcntl(sockid,F_SETFL,O_NONBLOCK);
while(1)
{
numbytes=recvfrom(sockid,buf,BUFSIZ,0,(struct sockaddr*) &their_addr,&addr_len);
if( numbytes == -1)
{
//perror("recvfrom");
}
else
{
printf("recvfrom ok.........\n");
printf("got packet from %s\n",inet_ntoa(their_addr.sin_addr));
printf("packet is %d bytes long\n",numbytes);
printf("packet contains \"%s\"\n",buf);
/*
strcpy(buf,"02005|05110122|10");
addr_len = sizeof(struct sockaddr);
numbytes = sendto(sockid,buf,strlen(buf),0,(struct sockaddr*)&their_addr,sizeof(struct sockaddr));
if(numbytes==-1)
{
printf("numbytes=%d\n",numbytes);
perror("sendto");
}
else
{
printf("sendto is ok ,now! \n");
}
break;
*/
addr_len = sizeof(struct sockaddr);
say_who_called(&their_addr);
reply_to_sender(sockid,buf,&their_addr,addr_len);
break;
}
}
printf("Everything is ok ,now! \n");
return 0;
}
void say_who_called(struct sockaddr_in* addrp)
{
char host[BUFSIZ];
int port;
get_internet_address(host,BUFSIZ,&port,addrp);
printf("who called from:%s:%d\n",host,port);
}
int get_internet_address(char* host,int len,int * portp,struct sockaddr_in* addrp)
{
strncpy(host,inet_ntoa(addrp->sin_addr),len);
*portp=ntohs(addrp->sin_port);
return 0;
}
void reply_to_sender(int sock,char*msg,struct sockaddr_in *addrp,socklen_t len)
{
int iret=0;
char reply[BUFSIZ+BUFSIZ];
sprintf(reply,"thanks for you %d char message\n",strlen(msg));
iret=sendto(sock,reply,strlen(reply),0,(struct sockaddr*)addrp,len);
if(iret!=-1)
printf("thanks for you %d char message \n",strlen(msg));
else
perror("sendto");
}
服务器端的