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[14];/*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[8];/*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 0;
}

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)

时间: 2024-10-13 21:14:55

Linux网络编程的一般步骤(1)的相关文章

很全的linux网络编程技巧

注:作者王晓,本人认为总结得很好,故记之,绝无侵权之意. 1. LINUX网络编程基础知识 1 1.1. TCP/IP协议概述 1 1.2. OSI参考模型及TCP/IP参考模型 1 1.3. TCP协议 3 1.4. UDP协议 5 1.5. 协议的选择 6 2. 网络相关概念 6 2.1. socket概念 7 2.2. socket类型 8 2.3. socket信息数据结构 8 2.4. 数据存储优先顺序的转换 8 2.5. 地址格式转化 9 2.6. 名字地址转化 10 3. sock

Linux网络编程

第二章 Linux网络编程 2.1客户——服务器模型 目前大多数网络应用程序在编写时都采用客户—服务器模型,假设一端是客户,另一端是服务器,让服务器提供给客户一定的服务内容.它要求有一方(服务器方)在启动执行程序后(无限期地)等待其他客户端程序与之通信.这里可以再分为两种具体类型:并发型交互与重复型交互. (1)并发型交互.在并发型交互模式下,程序的主要运作步骤如下: ·等待一个客户请求的到来: ·生成一个新的进程或者任务来处理这个客户请求,同时这里还可以接收其他客户的请求,处理结束后,终止这个

Linux网络编程(一)

1.socket     int socket(int domain, int type,int protocol) domain:说明我们网络程序所在的主机采用的通讯协族(AF_UNIX和AF_INET等). AF_UNIX只能够用于单一的Unix系统进程间通信,而AF_INET是针对Internet的,因而可以允许在远程 主机之间通信(当我们 man socket时发现 domain可选项是 PF_*而不是AF_*,因为glibc是posix的实现 所以用PF代替了AF,不过我们都可以使用的

Linux网络编程入门 (转载)

http://www.cnblogs.com/RascallySnake/archive/2012/01/04/2312564.html (一)Linux网络编程--网络知识介绍 Linux网络编程--网络知识介绍客户端和服务端         网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端. 客户端        在网络程序中,如果一个程序主动和外面的程序通信,那么我们把这个程序称为客户端程序. 比如我们使用ftp程序从另外一        个地方获取文件

Linux网络编程--多播

一.多播介绍 什么是多播? 单播用于两个主机之间的端对端通信,广播用于一个主机对整个局域网上所有主机上的数据通信.单播和广播是两个极端,要么对一个主机进行通信,要么对整个局域网上的主机进行通信.实际情况下,经常需要对一组特定的主机进行通信,而不是整个局域网上的所有主机,这就是多播的用途.多播,也称为"组播",将局域网中同一业务类型主机进行了逻辑上的分组,进行数据收发的时候其数据仅仅在同一分组中进行,其他的主机没有加入此分组不能收发对应的数据. 多播的地址是特定的,D类地址用于多播.D类

Linux网络编程入门

(一)Linux网络编程--网络知识介绍 Linux网络编程--网络知识介绍 客户端和服务端 网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端. 客户端 在网络程序中,如果一个程序主动和外面的程序通信,那么我们把这个程序称为客户端程序. 比如我们使用ftp程序从另外一 个地方获取文件的时候,是我们的ftp程序主动同外面进行通信(获取文件), 所以这个地方我们的ftp程序就是客户端程序. 服务端 和客户端相对应的程序即为服务端程序.被动的等待外面的程序来和自己通

Linux 网络编程基础(4) -- Ping 的C代码实现

1.背景 在进行网络编程的时候,通常使用的协议有TCP协议,UDP协议.这些协议在简历套接字之初需要制定套接字的类型,比如TCP应当设置为 SOCK_STREAM, UDP对应的套接字应当设置为SOCK_DGRAM.但是这些套接字并非能够提供网络所需的全部功能,我们还需要其他的套接字,比如原始套接字OCK_RAW.原始 套接字可以提供SOCK_STREAM和SOCK_DGRAM所不及的能力.比如: (1)有了原始套接字,进程可以读取ICMPV4.ICMPV6.IGMP等的分组.正如ping所使用

linux 网络编程

linux网络编程中主要分为服务器和客户端两部分,而网络编程中又分为TCP和UDP两种.TCP(传输控制协议)和UDP(用户数据报协议是网络体系结构TCP/IP模型中传输层一层中的两个不同的通信协议.TCP:传输控制协议,一种面向连接的协议,给用户进程提供可靠的全双工的字节流,TCP套接口是字节流套接口(stream socket)的一种.UDP:用户数据报协议.UDP是一种无连接协议.UDP套接口是数据报套接口(datagram socket)的一种. ====================

【LINUX网络编程】Makefile文件

<Linux网络编程>(第二版) 第2章的一些读书笔记 ↓ Makefile:在一个含有较多文件的工程中,定义一系列规则来指定编译文件的顺序,可用于管理工程. Makefile指定了工程中的哪些源文件需要编译以及如何编译.需要创建那些库文件以及如何创建这些库文件.如何最后产生我们想要的可执行文件.为工程编写Makefile 的好处是能够使用一行命令来完成“自动化编译”,编译整个工程你所要做的唯一的一件事就是在shell 提示符下输入make命令,整个工程就完全自动编译. 首先来看一下Linux