#include #include #include #include #include #define ECHO_PORT 7775 #define DEBUG 1 //static struct rtsocket *echo_sock; static int echo_sock; #define BUFSZ 1500 char buffer[BUFSZ]; /* main */ main(int argc, char *argv[]) { struct sockaddr_in addr; int ret,i; struct msghdr msg; struct iovec iov; echo_sock = socket(AF_INET,SOCK_DGRAM,0); memset(&addr,0,sizeof(addr)); addr.sin_family = AF_INET; addr.sin_port = htons(ECHO_PORT); addr.sin_addr.s_addr = htonl(INADDR_ANY); bind(echo_sock,(struct sockaddr *)&addr,sizeof(addr)); fprintf(stderr,"echo_server started\n"); /*********************************************************************************/ /* for(i = 0; i<100; i++) { buffer[i] = i; } */ ret = 0; while ( ret != 1 ) { memset(&msg,0,sizeof(msg)); iov.iov_base=buffer; iov.iov_len=BUFSZ; msg.msg_name=NULL; msg.msg_iov=&iov; msg.msg_iovlen=1; msg.msg_control=NULL; msg.msg_controllen=0; msg.msg_name=&addr; msg.msg_namelen=sizeof(addr); ret=recvmsg(echo_sock,&msg,0); fprintf(stderr,"recvmsg()=%d\n",ret); fprintf(stderr,"%p: %i %i %i\n",iov.iov_base,((char*)iov.iov_base)[0],((char*)iov.iov_base)[1],buffer[2]); iov.iov_base = buffer; iov.iov_len = ret; if(ret>0){ fprintf(stderr,"echo rcv from %08x.%d\n",(int)ntohl(addr.sin_addr.s_addr),(int)ntohs(addr.sin_port)); fprintf(stderr,"iov_base bef.send:%p\n",iov.iov_base); /* forcing it to send the echo back to the echo port and not to the sending port */ addr.sin_port = htons(ECHO_PORT); //s ret=sendmsg(echo_sock,&msg,0); //s fprintf(stderr,"sendmsg()=%d\n",ret); fprintf(stderr,"%p: %i %i %i\n",iov.iov_base,buffer[0], buffer[1], buffer[2]); } } /*********************************************************************************/ close(echo_sock); fprintf(stderr,"echo_server stopped\n"); return 0; }