⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 echoserver.c

📁 chat program in linux use multiple broadcase implement by c language
💻 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 + -