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

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

1572

被折叠的 条评论
为什么被折叠?



