辅助函数:Linux UDP socket

11 篇文章 0 订阅
Linux下UDP socket辅助函数
dgram.h:
#ifndef _DGRAM_H_
    
#define  _DGRAM_H_
    
int  make_dgram_server_socket( int );
    
int  make_dgram_client_socket( void );
    
int  make_internet_address( char   * , int , struct  sockaddr_in  * );
    
int  get_internet_address( char   * , int   * , struct  sockaddr_in  * );
#endif

dgram.c:
/*******************************************************************
 * dgram.c
 * support functions for datagram based programs
 
*/

#include 
< stdio.h >
#include 
< unistd.h >
#include 
< sys / types.h >
#include 
< sys / socket.h >
#include 
< netinet / in .h >
#include 
< arpa / inet.h >
#include 
< netdb.h >
#include 
< string .h >

#define  HOSTLEN 256

int  make_internet_address( char   * , int , struct  sockaddr_in  * );

/*******************************************************************
 * make sever dgram socket
 
*/

int  make_dgram_server_socket( int  portnum)  {
    
struct sockaddr_in saddr;            // build our address here
    char hostname[HOSTLEN];                // addrss
    int sock_id;                    // the socket

    sock_id 
= socket(PF_INET,SOCK_DGRAM,0);        // get a socket
    if(sock_id == -1{
        perror(
"Create socket error");
        
return -1;
    }


    
// build address and bind it to socket
    gethostname(hostname,HOSTLEN);            // where am I?
    make_internet_address(hostname,portnum,&saddr);

    
if(bind(sock_id,(struct sockaddr *)&saddr,sizeof(saddr)) != 0{
        perror(
"Bind socket error");
        
return -1;
    }


    
return sock_id;
}
//  make_dgram_server_socket

/*******************************************************************
 * make client dgram socket
 
*/

int  make_dgram_client_socket()  {    
    
return socket(PF_INET,SOCK_DGRAM,0);
}


/*******************************************************************
 * constructor for an Internet socket address, uses hostname and port
 * (host,port) -> *addrp
 
*/

int  make_internet_address( char   *  hostname, int  port, struct  sockaddr_in  * addrp)  {
    
struct hostent *hp;

    bzero((
void *)addrp,sizeof(struct sockaddr_in));
    hp 
= gethostbyname(hostname);
    
if(hp == NULL) {
        perror(
"Get host name error");
        
return -1;
    }


    bcopy(hp 
-> h_addr,(void *)&addrp->sin_addr,hp->h_length);
    addrp
->sin_port = htons(port);
    addrp
->sin_family = AF_INET;

    
return 0;
}


/*******************************************************************
 * extracts host and port from an internet socket address
 * addrp -> (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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值