辅助函数:Linux UDP socket

本文介绍了一种在Linux环境下使用UDP协议进行网络编程的方法。主要包括创建服务器和客户端套接字的函数实现,以及如何构造和解析互联网地址。通过这些辅助函数,可以简化UDP应用程序的开发流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值