linux网络编程笔记
日期:2009-03-26
------------------------------
套接字类型:
1、 SOCK_STREAM (面向连接,TCP/IP)
2、 SOCK_DGRAM (无连接,UDP)
------------------------------
网络数据包结构体
struct sockaddr {
unsigned short sa_family; /* 地址家族, AF_xxx */
char sa_data[14]; /*14字节协议地址*/
};
struct sockaddr_in {
short int sin_family; /* 通信类型 */
unsigned short int sin_port; /* 端口 */
struct in_addr sin_addr; /* Internet 地址 */
unsigned char sin_zero[8]; /* 与sockaddr结构的长度相同*/
};
struct in_addr {
unsigned long s_addr;
};
struct hostent {
char *h_name; /* official name of host * /
char **h_aliases; /* alias list */
int h_addrtype; /* host address type */
int h_length; /* length of address */
char **h_addr_list; /* list of addresses */
}
------------------------------
一些简单的缩写表示
h => host
2 => to
n => network
s => short(从本机字节顺序转 换为网络字节顺序。)
htons() => h-to-n-s => Host to Network Short
htonl() => h-to-n-l => Host to Network Long
ntohs() => n-to-h-s => Network to Host Short
ntohl() => n-to-h-l => Network to Host Long
------------------------------
网络IP地址及处理
一、将IP地址从点数格式转换成无符号长整型。
struct sockaddr_in ina;
ina.sin_addr.s_addr = inet_addr("132.241.5.10"); /*inet_addr发生错误时,返回-1*/
二、 in_addr 结构体输出成点数格式
inet_ntoa()("ntoa"的含义是"network to ascii"),
printf("%s",inet_ntoa(ina.sin_addr));
使用inet_ntoa需要注意的是:
1、inet_ntoa()将结构体in-addr作为一 个参数,不是长整形。
2、它返回的是一个指向一个字符串的指针。它是一个由inet_ntoa()控制的静态的固定的指针,所以每次调用inet_ntoa(),它就将覆盖上次调用时所得的IP地址。
char *a1, *a2;
a1 = inet_ntoa(ina1.sin_addr); /* 这是198.92.129.1 */
a2 = inet_ntoa(ina2.sin_addr); /* 这是132.241.5.10 */
printf("address 1: %s\n",a1);
printf("address 2: %s\n",a2);
输出如下:
address 1: 132.241.5.10
address 2: 132.241.5.10
------------------------------
socket()函数
#include <sys/types.h>
#include <sys/socket.h>
/**
*返回socket描述符。
*return:错误发生时返回-1.
*/
int socket(int domain, int type, int protocol);
domain: 应该设置成 "AF_INET",就象上面的数据结构struct sockaddr_in 中一样。
type: SOCK_STREAM 或者 SOCK_DGRAM
protocol: 一般为0
------------------------------
bind()函数
#include <sys/types.h>
#include <sys/socket.h>
/**
*客户端绑定的端口号,端口号为0时表示随机选择一个可用的端口号。
*return: 发生错误时返回-1
*/
int bind(int sockfd, struct sockaddr *my_addr, int addrlen);
sockfd: 是调用 socket 返回的文件描述符。
my_addr: 是指向数据结构 struct sockaddr 的指针,它保存你的地址(即端口和 IP 地址) 信息。
addrlen: 设置为 sizeof(struct sockaddr)。
my_addr.sin_port = htons(0); /* 随机选择一个没有使用的端口 */
my_addr.sin_addr.s_addr = htonl(INADDR_ANY);/* 使用自己的IP地址 */
------------------------------
connect()函数
#include <sys/types.h>
#include <sys/socket.h>
/**
*
*return: 发生错误时返回-1
*/
int connect(int sockfd, struct sockaddr *serv_addr, int addrlen);
sockfd: 是系统调用 socket() 返回的套接字文件描述符。
serv_addr: 是 保存着目的地端口和 IP 地址的数据结构 struct sockaddr。
addrlen: 设置 为 sizeof(struct sockaddr)。
------------------------------
listen()函数
/**
*return: 发生错误时返回-1
*/
int listen(int sockfd, int backlog);
sockfd: 是调用 socket() 返回的套接字文件描述符。
backlog: 是在进入队列中允许的连接数目。进入的连接是在队列中一直等待,直到你接受( accept() ) 连接。它们的数目限制于队列的允许。大多数系统的允许数目是20,你也可以设置为5到10。
------------------------------
accept()函数
#include <sys/socket.h>
int accept(int sockfd, void *addr, int *addrlen);
sockfd 是调用 socket() 返回的套接字文件描述符。
addr 是个指向局部的数据结构 sockaddr_in 的指针。这是要求接入的信息所要去的地 方(你可以测定那个地址在那个端口呼叫你)。在它的地址传递给 accept 之 前。
addrlen 是个局部的整形变量,设置为 sizeof(struct sockaddr_in)。
------------------------------
send() and recv()函数
这两个函数用于流式套接字或者数据报套接字的通讯。
int send(int sockfd, const void *msg, int len, int flags);
sockfd: 是你想发送数据的套接字描述符(或者是调用 socket() 或者是 accept() 返回的。)
msg: 是指向你想发送的数据的指针。
len: 是数据的长度。 把 flags 设置为 0 就可以了。
send() 返回实际发送的数据的字节数--它可能小于你要求发送的数目.
注意,有时候你告诉它要发送一堆数据可是它不能处理成功。它只是 发送它可能发送的数据,然后希望你能够发送其它的数据。
记住,如果 send() 返回的数据和 len 不匹配,你就应该发送其它的数据。但是这里也 有个好消息:如果你要发送的包很小(小于大约 1K),它可能处理让数据一 次发送完。最后要说得就是,它在错误的时候返回-1,并设置 errno。
recv() 函数
int recv(int sockfd, void *buf, int len, unsigned int flags);
sockfd 是要读的套接字描述符。
buf 是要读的信息的缓冲。
len 是缓 冲的最大长度。
flags 可以设置为0。(请参考recv() 的 man page。) recv() 返回实际读入缓冲的数据的字节数。或者在错误的时候返回-1, 同时设置 errno。
------------------------------
sendto() 和 recvfrom()函数
int sendto(int sockfd, const void *msg, int len, unsigned int flags,
const struct sockaddr *to, int tolen);
struct sockaddr 的指针,它包含了目的地的 IP 地址和端口信息。
tolen 可以简单地设置为 sizeof(struct sockaddr)。
int recvfrom(int sockfd, void *buf, int len, unsigned int flags,
struct sockaddr *from, int *fromlen);
from 是一个指向局部数据结构 struct sockaddr 的指针,它的内容是源机器的 IP 地址和端口信息。
fromlen 是个 int 型的局部指针,它的初始值为 sizeof(struct sockaddr)。
记住,如果你用 connect() 连接一个数据报套接字,你可以简单的调 用 send() 和 recv() 来满足你的要求。这个时候依然是数据报套接字,依 然使用 UDP,系统套接字接口会为你自动加上了目标和源的信息。
------------------------------
close()和shutdown()函数
int close(int sockfd);
int shutdown(int sockfd, int how);
sockfd 是你想要关闭的套接字文件描述复。
how 的值是下面的其中之 一:
0 – 不允许接受
1 – 不允许发送
2 – 不允许发送和接受(和 close() 一样)
shutdown() 成功时返回 0,失败时返回 -1
------------------------------
getpeername()函数
#include <sys/socket.h>
int getpeername(int sockfd, struct sockaddr *addr, int *addrlen);
sockaddr_in 的指针,它保存着连接的另一边的 信息。
addrlen 是一个 int 型的指针,它初始化为 sizeof(struct sockaddr)。
函数在错误的时候返回 -1
一旦你获得它们的地址,你可以使用 inet_ntoa() 或者 gethostbyaddr() 来打印或者获得更多的信息。
------------------------------
gethostname()函数
#include <unistd.h>
int gethostname(char *hostname, size_t size);
获取程序所运行的机器的主机名字
hostname 是一个字符数组指针,它将在函数返回时保存 主机名。
size是hostname 数组的字节长度。
------------------------------
gethostbyname()函数
#include <netdb.h>
struct hostent *gethostbyname(const char *name);
返回一个指向 struct hostent 的指针。
struct hostent {
char *h_name; /* official name of host * /
char **h_aliases; /* alias list */
int h_addrtype; /* host address type */
int h_length; /* length of address */
char **h_addr_list; /* list of addresses */
}
h_name – 地址的正式名称。
h_aliases – 空字节-地址的预备名称的指针。
h_addrtype –地址类型; 通常是AF_INET。
h_length – 地址的比特长度。
h_addr_list – 零字节-主机网络地址指针。网络字节顺序。
h_addr - h_addr_list中的第一地址。
分享到:
相关推荐
### Linux网络编程基础知识点 #### 一、网络工具与协议概览 在Linux网络编程中,`netstat`是一个常用工具,用于显示网络连接、路由表、接口统计、masquerade连接、多播成员等信息。通过选项`-an`可以查看详细的...
【Linux网络编程笔记】TCP短连接产生大量TIME_WAIT导致无法对外建立新TCP连接的原因及解决方法,这是一个关于网络编程和Linux系统配置的问题。在TCP/IP通信中,TIME_WAIT状态是TCP连接生命周期的一部分,用于确保...
### Linux网络编程笔记(修订版) #### 基本概念 网络编程是在计算机网络中实现数据交换和资源共享的重要技术手段。对于Linux环境下的网络编程,理解基础概念是至关重要的第一步。 1. **OSI参考模型**:开放系统...
### Linux网络编程超级详细笔记 #### 一、Linux网络基础知识 ##### 1.1 客户端程序和服务端程序 在网络编程中,程序通常被划分为两大部分:**客户端**和**服务端**。这种划分使得不同的计算机或设备能够相互通信...
Linux系统编程笔记涉及到的内容广泛,涵盖了从基础的出错处理到进程管理,从内存管理到进程间通信,以及守护进程设计等多个层面的知识。下面详细说明各个部分的知识点: 1. 常见出错处理 - abort函数用于异常终止...
linux系统编程和网络编程笔记
总的来说,"Linux系统编程及网络编程笔记"会详细解析上述各个方面,包括理论知识、实际示例和最佳实践,旨在帮助学习者深入理解Linux环境下的系统编程和网络编程,为开发高效、安全的系统级应用程序和网络服务打下...
以上是基于《GNU/Linux系统编程笔记》中的知识点总结,涵盖了错误处理、I/O操作、文件目录管理、进程控制、线程、内存管理、IPC以及守护进程设计等关键领域,对于深入理解Linux系统编程有重要价值。
### Linux网络编程详细知识点 #### 一、Linux网络基础知识 **1.1 客户端与服务端程序** - **概念区分**: - **客户端**:负责发起连接请求的一方,通常用来发送数据或请求服务。 - **服务端**:等待客户端连接...
描述:这是一份综合的Linux Shell编程笔记,适用于想要学习或加强对Linux操作系统下Shell脚本编程的理解的人。该笔记包含了Shell脚本的基础知识、常用命令和技巧,以及实际的编程示例和案例。无论您是初学者还是有...
### Linux网络编程全接触笔记详解 #### 一、分层模型结构 1. **OSI 7层模型**:这是国际标准化组织(ISO)提出的一个网络分层模型,旨在为不同厂商之间的网络设备提供标准接口。它从下往上依次分为: - **物理层*...
### 黑马_Linux网络编程-网络基础-socket编程-高并发服务器 #### 知识点概述 本篇文章旨在深入解读“黑马_Linux网络编程-网络基础-socket编程-高并发服务器”相关的核心概念和技术要点,包括网络基础知识、常用...
在对王健伟老师的Linux C++网络编程课程进行辅助学习时,工程思维导图作为一种图形化思维工具,可以帮助学生更系统地理解和掌握复杂的知识点。这份资料中提到的内容涉及到网络编程的多个关键概念和实现细节,下面将...
### Linux系统编程核心知识点 #### 一、计算机系统组成与硬件结构 - **计算机系统硬件组成**: - **CPU**:中央处理器,包括运算器和控制器,负责指令的执行和控制系统的运行。 - **内存**:用于暂时存储运行中...
这份个人笔记涵盖了几个关键的Linux技术:GDB调试工具、Linux网络编程以及Makefile构建自动化工具。以下是对这些主题的详细阐述: 一、GDB(GNU调试器) GDB是GNU项目的一部分,是一款强大的源代码级调试器,用于C...