Linux网络编程的一般步骤(1)
一、套接字的地址结构.
IPV4套接字地址结构通常也称为"网际套接字地址结构",它以sockaddr_in
命名;POSIX定义如下:
#include <stdio.h>
struct in_addr
{
unsigned long s_addr; /*32-bit IPv4 address
network byte ordered*/
};
/*socketaddr结构体一般是一般是用作参数来使用,指明地址信息*/
struct sockaddr
{
unsigned short sa_family;/*address family,AF_XXX*/
char sa_data[];/*14bytes of protocol address*/
};
/*sa_family是地址家族,一般都是"AF_XXX"的形式.*/
/*sa_data是14字节协议地址.sockaddr此结构体不作为操作的对象
而是用作bind,connect,recvfrom,sendto函数的参数,指明地址信息.*/
struct sockaddr_in
{
short sockaddr_in; /*Address family*/
unsigned short sin_port;/*Port number*/
struct in_addr sin_addr; /*Internet address*/
unsigned char sin_zero[];/*Same size as struct sockaddr*/
};
/*
sin_family指定协议族,在socket编程中只能是AF_INET.
sin_port存储端口号(一般和htons配合使用转换为网络字节顺序)
sin_addr存储IP地址,使用in_addr这个数据结构.
sin_zero是为了让sockadr和sockaddr_in两个数据结构保持大小相同而
保留的空字节.
*/
int main(void)
{
/*大小是一样的.*/
printf("sizeof(sockaddr_in) = %d,sizeof(sockaddr) = %d\n",
sizeof(struct sockaddr_in),sizeof(struct sockaddr));
return ;
}
1.主机字节序和网络字节序之间的转换函数
unsigned short htons(unsigned short host16bit);
unsigned long htonl(unsigned long host32bit);返回网络字节序的值.
unsigned short ntohs(unsigned short net16bit);
unsigned long ntohl(unsigned long net32bit);
返回主机字节序的值.
h代表host,n代表network,s代表short,l代表long.
2.字节操作函数
#include <strings.h>
void bzero(void* dest,size_t nbytes);
void bcopy(const void* src,void* dest,size_t nbytes);
int bcmp(const void* ptrl,const void* ptr2,size_t nbytes);
bzero把目标字节字符串中指定数目的字节置成0.我们经常使用该函数来把
一个套接字地址结构初始化为0.
bcopy将指定数据的字节从源字节串移动到目标字节串.
bcmp比较两个任意的字节串,若相同则返回0,否则返回为非0.
ANSI C函数
#include <string.h>
void* memset(void* dest,int c,size_t len);
void* memcpy(void* dest,const void* src,size_t nbytes);
int memcmp(const void* ptr1,const void* ptr2,size_t nbytes);
memset把目标指定数据的字节置为值c,memcpy类似bcopy
不过两个指针参数的顺序是相反的.
当源字节串与目标字节串重叠的时候,bcopy能正确处理,但是
memcpy的操作结果是未知的.这种情形之下必须改用ANSI C
下的memmove.
3.地址转换函数
int inet_aton(const char* strptr,struct in_addr* addrptr);
字符串有效则返回1,否则为0;
将strptr所指的C字符串转换成一个32位的网络字节序的二进制,
并通过指针addrptr来存储.若成功返回1,失败0
char* inet_ntoa(struct in_addr inaddr);
指向一个点分十进制数串的指针.
in_addr_t inet_addr(const char* strptr);
若字符串有效则为32位二进制网络字节序的IPV4地址,
否则为INADDR_NONE;
char* inet_ntoa(struct in_addr inaddr);
返回一个点分十进制串的指针.
地址之间转换比较统一的函数:
#include <arpa/inet.h>
int inet_pton(int family,const char* strptr,void* addrptr);
若成功返回1,若输入不是有效的表达式则为0,出错返回-1.
const char* inet_ntop(int family,const void* addrptr,char* srptr,size_t len);
若成功则为指向结果的指针,若出错则为NULL。
二、基本TCP套接字编程.
1.创建socket描述符.
int socket(int family,int type,int protocol);
//若成功则为非负描述符,若出错则为-1.
family参数指明协议族,AF_INET,AF_LOCAL,AF_INET6
type指的是字节顺序,一般是SOCK_STREAM数据流,和SOCK_DGREAM数据报.
SOCK_SEQPACKET 有序分组套接子,SOCK_RAW原始套接字.
protocol IPPROTO_CP TCP传输协议
IPPROTO_UDP UDP传输协议
IPPROTO_SCTP SCTP传输协议
2.TCP客户用connect函数来建立与TCP服务器的连接.
int connect(int sockfd,const struct sockaddr* servaddr,socklen_t addrlen);
若成功返回0,若出错返回-1.
sockfd是由socket函数返回的套接字描述符,第二个第三个参数
分别是执行套接字的地址结构的指针和该指针的大小.
客户在调用函数connect前不必非要调用bind函数,因为如果需要的话,
内核会确定源IP地址,并选择一个临时端口作为源端口.
如果是TCP套接字,调用connect函数将激发TCP的三路
握手过程,而且仅当连接建立成功或出错的时候才返回,其中出
TCP状态转换图,connect函数导致当前套接字从CLOSED状态
(该套接字由socket函数创建以来一致所处的状态)转移到
SYN_SENT状态,若成功则再转移到ESTABLISHED状态.
3.int bind(int sockfd,const struct sockaddr* myaddr,socklen_t addrlen);
第二个参数是一个指向特定于协议的地址结构的指针,第三个参数是该地址结构的长度.
一般用于服务器的把地址和端口绑定起来,如果一个TCP客户或服务器
未曾调用bind捆绑一个端口,当调用connect或linsten时,内核就要为相应的
套接字选择一个临时端口.
4.int listen(int sockfd,int backlog);
listen函数仅由TCP服务器调用,它做两件事情.
a.当socket函数创建一个套接字时,它被假设为一个主动套接字,也就是说,
它是一个将调用connect发起连接的客户套接字.listen函数把一个未连接的套接字转换
成一个被动套接字,指示内核应接收执行该套接字的连接请求.根据TCP状态图,调用
listen导致套接字从CLOSED状态转换到LISTEN状态.
b.本函数的第二个参数规定了内核应该为相应套接字排队的最大连接数.
成功返回0,失败返回-1.
5.accept函数由TCP服务器调用,用于从已经完成连接队列队头返回下一个已完成连接.
如果已完成连接队列为空,那么进程被投入睡眠(假定套接字为默认的阻塞方式)
int accept(int sockfd,struct sockaddr* cliaddr,socklen_t* addrlen);
cliaddr和addrlen用来返回已经连接的对端进程(客户)的协议地址.addrlen是值-结果参数
成功返回非负描述符,出错返回-1.
如果accept成功,则返回值是由内核自动生成的一个全新描述符,代表与所返回客户的
TCP连接.在讨论accept函数时,我们称它的第一个参数为监听套接字描述符,称它的返回
值为已经连接的套接字描述符.一个服务器通常仅仅创建一个监听套接字,它在该服务器
的生命周期内一直存在.内核为每个由服务器进程接收的客户连接创建一个已连接套接
字.当服务器完成对某个给定客户的服务时,相应的已经连接套接字就会被关闭.
6.fork()函数
pid_t fork(void);
在子进程中为0,在父进程中为进程ID,出错返回-1.
函数特定:
该函数调用一次,返回两次.
Linux网络编程的一般步骤(1)的更多相关文章
- 【linux草鞋应用编程系列】_5_ Linux网络编程
一.网络通信简介 第一部分内容,暂时没法描述,内容实在太多,待后续专门的系列文章. 二.linux网络通信 在linux中继承了Unix下“一切皆文件”的思想, 在linux中要实现网 ...
- linux网络编程_1
本文属于转载,稍有改动,以利于学习. (一)Linux网络编程--网络知识介绍 Linux网络编程--网络知识介绍客户端和服务端 网络程序和普通的程序有一个最大的区别是网络程序是由两个 ...
- Linux网络编程入门 (转载)
(一)Linux网络编程--网络知识介绍 Linux网络编程--网络知识介绍客户端和服务端 网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端. 客户 ...
- [转] - Linux网络编程 -- 网络知识介绍
(一)Linux网络编程--网络知识介绍 Linux网络编程--网络知识介绍客户端和服务端 网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端. 客户 ...
- 【转】Linux网络编程入门
(一)Linux网络编程--网络知识介绍 Linux网络编程--网络知识介绍客户端和服务端 网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端. 客户 ...
- 《转》Linux网络编程入门
原地址:http://www.cnblogs.com/duzouzhe/archive/2009/06/19/1506699.html (一)Linux网络编程--网络知识介绍 Linux网络编程-- ...
- Linux网络编程(四)
在linux网络编程[1-3]中,我们编写的网络程序仅仅是为了了解网络编程的基本步骤,实际应用当中的网络程序并不会用那样的.首先,如果服务器需要处理高并发访问,通常不会使用linux网络编程(三)中那 ...
- Linux网络编程(二)
Linux网络编程(二) 使用多进程实现服务器并发访问. 采用多进程的方式实现服务器的并发访问的经典范例. 程序实现功能: 1.客户端从标准输入读入一行文字,发送到服务器. 2.服务器接收到客户端发来 ...
- linux 网络编程
linux网络编程中主要分为服务器和客户端两部分,而网络编程中又分为TCP和UDP两种.TCP(传输控制协议)和UDP(用户数据报协议是网络体系结构TCP/IP模型中传输层一层中的两个不同的通信协议. ...
随机推荐
- 红包demo
嘿嘿,红包demo import random dic={} lis=['KeLan','MonKey','Dexter','Superman','Iron Man','Robin'] def red ...
- Python之路 day2 字典练习题之 三级菜单
#Author:ersa ''' 程序: 三级菜单 要求: 打印省.市.县三级菜单 可返回上一级 可随时退出程序 ''' menu = { '北京':{ '海淀':{ '五道口':{ 'soho':{ ...
- 查找数组中重复项的index
var ary = [5, 4, 4, 2, 7, 8, 33, 2222, 99, 88]; function isRepeat(arr) { var hash = {}; for (var i=0 ...
- 谈谈javascript中的日期Date对象
一.日期对象 在javascript中并没有日期型的数据类型,但是提供了一个日期对象可以操作日期和时间. 日期对象的创建: new Date();二.将日期对象转换为字符串 将日期对象转换为字 ...
- 【转】mysql查询结果输出到文件
转自:http://www.cnblogs.com/emanlee/p/4233602.html mysql查询结果导出/输出/写入到文件 方法一: 直接执行命令: mysql> select ...
- CSS样式应用
CSS样式应用的方法: (1)行内样式,将css样式直接放到标签当中,一般都是放入标签的style属性中,它是最方便的一种样式,也是最不方便修改的样式.如下: (2)内嵌式,通过将css写在网页源文件 ...
- 未找到导入的项目,请确认 <Import> 声明中的路径正确
当使用vs出现下列情况: D:\xxxx\Web\Web.csproj : error : 无法读取项目文件“Web.csproj”. D:\xxxx\WebServiceManager\Web\W ...
- CentOS下 MySQL5.7 详细的部署安装流程
MySQL5.7.14安装过程: 下载5.7版本:wget http://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.14-linux-glibc2 ...
- Oracle通过一个Value值查询数据库
---恢复内容开始--- 大家在想看看数据库中有哪些数据表中,哪些字段中有“helloworld” 这个字符串,现在数据库所有的表,视图都不能直接提供,所有必须通过循环去访问所有的数据表,所有的字段列 ...
- YCSB-压测
安装 wget http://download.oracle.com/otn-pub/java/jdk/7u40-b43/jdk-7u40-linux-x64.rpm #注意此处到官网下载后上传,需要 ...