关闭

辅助函数:Linux UDP socket

815人阅读 评论(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

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:65546次
    • 积分:1088
    • 等级:
    • 排名:千里之外
    • 原创:32篇
    • 转载:23篇
    • 译文:0篇
    • 评论:4条
    文章分类
    最新评论