linux程序设计---网络编程
参考资料:linux程序设计 作者:马修
创建一个套接字:
#include
#include
int socket(int domain,int type,int protocol);
套接字的域,常用的有:AF_UNIX,AF_INET 既是本地套接字,网络套接字。
套接字的类型:SOCK_STREAM SOCK_DGRAM 既是字节流和数据图
protocol一般是有前两个参数决定的,可以默认为0.
本地套接字地址:
struct sockaddr_un {
sa_family_t sun_family; /*AF_UNIX*/
char sun_path[]; /*PATH*/ 绝对地址
}
网络套接字地址:
struct sockaddr_in {
short int sin_family; /*AF_INET*/
unsigned short int sin_port; /*port number*/ 端口号
struct in_addr sin_addr; /*Internet address*/ IP地址
}
struct in_addr {
unsigned long int s_addr;
}
给套接字取名字:服务器套接字必须要取名字。
#include
int bind(int socket,const struct sockaddr *address,size_t address_len);
该函数的作用是把地址信息和未命名套接字关联起来,成功返回0,失败返回-1。
创建套接字队列:
#include
int listen(int socket,int backlog);
创建一个队列,用于存放客户连接,最大的客户连接数有backlog决定,成功返回0,失败返回-1。
接受连接:
#include
int accept(int socket,struct sockaddr *address,size_t address_len);
accept()函数将创建出一个新的套接字处理客户连接,当listen创建出来的队列里没有等待客户连接时,accept()函数讲阻塞,直到有客户连接位置,返回的是
新建套接字的文件描述符。调用者客户的地址将被放到sockaddr参数指定的地址,如果不关心客户连接的地址,这个地址赋值为空指针。
改变套接字调用accept()函数的阻塞属性可以使用函数fcntl();
int flags = fcntl(socket,F_GETFL,0);
fcntl(socket,F_SETFL,O_NONBLOCK | flags);
请求连接:
#include
int connect(int socket,const struct sockaddr *address,size_t address_len);
作用是把套接字连接到address所指定的服务器套接字上,成功返回0,失败返回-1.如果一次连接没有立刻建立,connect()函数将会在一个不定的时间内阻塞
如果这段时间内还没有建立连接,这次connect调用将流产。如果想让connect()函数在没有立刻建立连接的情况下立刻返回,可以使用fcntl()函数,修改属性。
具体操作如accept()函数。
关闭一个套接字:
close(int socket);
主机字节顺序和网络字节顺序不一样的情况下,使用一下函数转换:
#include
unsigned long int htonl(unsigned long int hostlong);
unsigned short int htons(unsigned short int hostshort);
unsigned long int ntohl(unsigned long int netlong);
unsigned short int ntohs(unsigned short int netshort);
这些函数的作用是把16位和32位整数的本地主机格式转换为标准的网络顺序。函数的名字与之对应的转换操作的缩写形式:比如:
htonl------host to net long
ntohl------net to host long
网络信息编程
#include //network database 网络数据库
主机数据库函数:
struct hostent *gethostbyname(const char *name);
struct hostent *gethostbyaddr(const void *addr,size_t len,int type);
返回的结构至少包含以下成员:
struct hostent {
char *h_name; /*name of the host */ 主机名字
char **h_aliases; /*list of sliases*/ 别名列表,可能有几个别名。
int h_addrtype; /*address type*/ 地址类型,AF_INET、AF_UNIX
int h_length; /*length in types of the address*/ 地址长度,以字节为单位
char **h_addr_list; /* list of address*/ 地址列表
}
服务信息函数:
struct servent *getservbyname(const char *name,const char *proto); //proto指定了连接该服务的协议,"tcp" "udp"
struct servent *getservbyport(int port,const char *proto); //proto指定了连接该服务的协议,"tcp" "udp"
返回的结构至少包含以下成员:
struct servent {
char *s_name; /*name of the host */
char **s_aliases; /*list of sliases*/
int s_port; /*The IP port number*/
char *s_proto; /*The service type,usually"tcp" or "udp"*/
}
得到的“网络字节顺序”的数据转换成可以直接打印的字符串
#include
char *inet_ntoa(struct in_addr in);
该函数的作用是把一个因特网主机地址转换成一个四点数格式的可打印字符串。失败返回-1。
#include
int gethostname(char *name,int namelength);
这个函数的作用是获得当前主机的名字并写道name指定的字符串里去。成功返回0,失败返回-1。
阅读(1589) | 评论(0) | 转发(0) |