📄 echoserver.c
字号:
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <netinet/in.h>
#include <signal.h>
#include <setjmp.h>
#include <string.h>
#include <error.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <string.h>
#include "udpr.h"
#define MAXLINE 4096
#define SA ( struct sockaddr )
static struct msghdr msgrecv;
static struct hdr {
unsigned int seq;
unsigned int ts;
} sendhdr, recvhdr;
int udp_recv_send ( int sockfd , const void * send , int sendlen , void * recv , int recvlen );
int main ( int argc , char ** argv )
{
int sockfd;
int recvfd;
socklen_t servlen;
struct sockaddr_in servaddr;
int ret_val;
char sendbuf [ MAXLINE + 1 ];
char recvbuf [ MAXLINE + 1 ];
if ( argc !=2 ){
printf ( "error : less port !\n" );
exit ( 0 );
}
sockfd = socket ( AF_INET , SOCK_DGRAM , 0 );
if ( sockfd == -1 ) {
printf ( "error : socket error ! \n" );
exit ( 1 ) ;
}
bzero ( &servaddr , sizeof ( servaddr ) );
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl ( INADDR_ANY );
servaddr.sin_port = htons ( atoi( argv[1] ) );
servlen = sizeof ( servaddr ) ;
ret_val = bind ( sockfd , ( struct sockaddr * ) &servaddr , servlen );
if ( ret_val == -1 ) {
printf ( "error : bind error !\n" );
exit ( 1 );
}
for ( ; ; ) {
udp_recv_send ( sockfd , sendbuf , MAXLINE , recvbuf , MAXLINE );
}
}
int udp_recv_send ( int sockfd , const void * send , int sendlen , void * recv , int recvlen )
{
int n;
struct iovec iovrecv[2];
int strlen;
char *recvsave;
struct sockaddr_in *cliaddrtest;
socklen_t clilen;
cliaddrtest = malloc ( sizeof (struct sockaddr_in ) );
clilen = sizeof ( struct sockaddr_in );
msgrecv.msg_name = ( void * )cliaddrtest;
msgrecv.msg_namelen = clilen;
msgrecv.msg_iov = iovrecv;
msgrecv.msg_iovlen =2;
iovrecv[0].iov_base = &recvhdr;
iovrecv[0].iov_len = sizeof ( struct hdr );
iovrecv[1].iov_base = ( void * ) recv;
iovrecv[1].iov_len = recvlen;
do {
n = recvmsg ( sockfd , &msgrecv , 0 );
if ( n < 0 ) {
printf( "error : recvmsg error !\n" );
exit ( 1 );
}
}while ( n < sizeof ( struct hdr ) );
strlen = n - sizeof ( struct hdr ) ;
recvsave = (char*)recv;
recvsave[ strlen ] = '\0';
printf ( "recive %d bytes from %s\n" , n ,inet_ntoa ( ( ( struct sockaddr_in *)cliaddrtest)->sin_addr ) );
printf ( "message : %s" , (char*)recv );
iovrecv[1].iov_len = strlen;
n = sendmsg ( sockfd , &msgrecv , 0 );
if ( n < 0 ){
printf ( "error : sendmsg error !\n" );
exit ( 1 );
}
printf ( "send %d bytes to %s\n",n,inet_ntoa ( ( ( struct sockaddr_in *)cliaddrtest)->sin_addr ) );
printf ( "message : %s\n" , (char*)recv );
return ( n - sizeof ( struct hdr ) );
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -