Linuxc之网络编程讲解及例题

TCP与UDP:
例题详见本人两篇博客:
1.tcp: 点击打开链接            https://blog.csdn.net/qq_37192076/article/details/80778649
2.udp: 点击打开链接           https://blog.csdn.net/qq_37192076/article/details/80778626

tcp:


udp:



服务器程序作用
初始化服务器程序
持续监听一个固定的端口
收到客户的连接后建立一个socket连接
与客户进行通信和信息处理
接收客户通过socket连接发送来的数据,创建一个新的socket,
通过socket连接与客户通信,进行相应处理,并返回处理结果
通信结束后中断与客户的连接(关闭socket)

客户程序作用
初始化客户程序
连接到某个服务器上,建立socket连接
与服务器进行通信和信息处理
接收服务器通过socket连接发送来的数据,进行相应处理
通过socket连接向服务器发送请求信息
通信结束后中断与客户的连接

socket基本概念
Socket接口是应用程序与TCP/IP协议栈的接口
定义一组函数/例程,支持TCP/IP网络应用程序开发
与数据通信相关的系统调用是read()/write()
是一种文件描述符
一个套接字描述一个通信连接的一端
两个通信程序中各自有一个套接字来描述自己的

网络编程基础-----套接字类型
流式套接字(SOCK_STREAM)
可靠的、面向连接的通信
使用TCP协议
数据报套接字(SOCK_DGRAM)
无连接服务
使用UDP协议
原始套接字(SOCK_RAW)
允许对底层协议(如IP、ICMP)直接访问

socket函数
功能
:创建一个套接字
#include <sys/socket.h>
函数原型
int socket(int domain, int type, int protocol);
参数说明
domain:通信协议族,即地址族
type:
套接字类型
protocol:通信协议
常设置为0 ,由内核根据指定的类型和协议族使用默认的协议
返回值
成功时,返回一个大于等于0的文件描述符
失败时,返回一个小于0的值


connect()函数
功能
:建立套接字连接
 #include <sys/socket.h>
函数原型
int  connect(int  sockfd,  const struct sockaddr *serv_addr, socklen_t addrlen);
参数说明
sockfd:调用socket返回的文件描述符
serv_addr:远程主机IP 地址和端口
addrlen:设置为 sizeof(struct sockaddr)
返回值
成功时,返回0
失败时,返回-1

sockaddr结构定义
功能:保存socket信息
结构
struct sockaddr {
  
unsigned short  sa_family; /* 地址族,AF_xxx */
char sa_data[14];  /* 协议地址 */
 };
说明
sa_family一般为AF_INET(表示TCP/IP)
sa_data包含socket的IP地址和端口号
/include/linux/socket.h
sockaddr_in
功能:
sockaddr的另一种表示形式
结构
struct sockaddr_in {  short int sin_family;      /* 地址族 */ unsigned short int sin_port; /* 端口号 */  struct in_addr sin_addr;    /* IP地址 */ unsigned char sin_zero[8]; /* 填充0,保持与struct sockaddr等长*/
};
说明
sin_zero用于将sockaddr_in结构填充到与struct sockaddr等长,可用bzero( )或memset( )函数将其置为0
当sin_port = 0时,系统随机选择一个未被使用的端口号
当sin_addr = INADDR_ANY时,表示从本机的任一网卡接收数据。
指向sockaddr_in的指针和指向sockaddr的指针可相互转换

write()函数
函数原型
ssize_t write(int fd, const void *buf, size_t nbytes)
功能:
将buf中的nbytes字节内容写入文件描述符fd
返回值:
成功时返回写的字节数
失败时返回-1,并设置errno变量
说明
:返回值大于0,表示写入部分或全部数据
返回值小于0,表示出现错误
如果错误为EINTR ,表示在写的时候出现中断错误
如果为EPIPE,表示网络连接出现问题


read()函数
函数原型
ssize_t read(int fd, void *buf, size_t nbyte)
功能
:从fd中读取内容
返回值:
读成功时,返回实际所读的字节数
如果返回的值是0 表示已经读到文件的结束,
出错时,返回值小于0
如果错误为EINTR,说明读是由中断引起的
如果是ECONNREST表示网络连接出了问题


send()函数
功能
:通过socket发送数据
头文件:
#include <sys/types.h>
#include <sys/socket.h>
函数原型
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
参数说明:sockfd:发送数据的套接字描述符
buf:指向发送数据的指针
len:数据长度
flags:一般设置为0
返回值
:成功时,返回实际发送的数据的字节数
失败时,返回-1


recv()函数
功能
:通过socket接收数据
头文件:
#include <sys/types.h>
#include <sys/socket.h>
函数原型
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
参数说明:
sockfd:要读的SOCKET描述符。
buf:要读的信息的缓冲区。
len:缓冲的最大长度。
flags:一般设置为0。
返回值:
成功时,返回实际接收到的数据的字节数。
失败时,返回-1。

bind()函数
功能:
将套接字地址与所创建的套接字号联系起来
客户端如果只想使用connect(),则无须使用该函数
#include <sys/socket.h>
函数原型
int bind(int sockfd, struct sockaddr *my_addr, socklen_t addrlen);
参数说明
sockfd:调用socket返回的文件描述符
my_addr:保存地址信息(IP地址和端口)
addrlen:设置为 sizeof(struct sockaddr)
返回值
:成功时,返回0
失败时,返回-1

listen()函数
功能
:用于面向连接服务器,监听链接请求队列
#include <sys/socket.h>
函数原型
int listen(int sockfd, int backlog);
参数说明
sockfd:调用socket返回的文件描述符
backlog:accept()应答之前,允许在进入队列中等待的连接数目,出错时返回-1
返回值
:成功时,返回0
失败时,返回-1
说明
:在使用listen()之前,需要调用bind()绑定到需要的端口,否则系统内核将会监听一个随机端口

accept()函数
功能
:建立套接字连接,处理单个连接请求(如发送/接收数据)
#include <sys/socket.h>
函数原型
int accept(int sockfd, struct void*addr, socklen_t *addrlen);
参数说明
sockfd:正在监听端口的套接字文件描述符
addr:指向本地数据结构sockaddr_in的指针
调用connect()的信息将存储在该结构中
addrlen:设置为sizeof(struct sockaddr_in)
返回值
:成功时,返回一个socket 端口
失败时,返回-1

sendto()函数
功能
:用于数据报套接字的通信
#include <sys/types.h>
#include <sys/socket.h>
函数原型
int sendto(int sockfd, const void *msg, int len, unsigned int flags, const struct sockaddr *to, int tolen);
参数说明
to:目地机的IP地址和端口号信息
tolen:常被赋值为sizeof (struct sockaddr)
返回值:
成功时,返回实际发送的数据的字节数
失败时,返回-1

recvfrom()函数
功能
:用于数据报套接字的通信
#include <sys/types.h>
#include <sys/socket.h>
函数原型
int recvfrom(int sockfd,void *buf, int len, unsigned int flags, struct sockaddr *from, int *fromlen);
参数说明
from:保存源机的IP地址及端口号
fromlen:常常被赋值为sizeof (struct sockaddr)
返回值
:成功时,返回实际接收到的数据的字节数
失败时,返回-1


非阻塞服务器——fcntl函数
头文件
#include <unistd.h>
#include <fcntl.h> 
函数原型int fcntl(int fd, int cmd); 
int fcntl(int fd, int cmd, long arg); 
int fcntl(int fd, int cmd, struct flock *lock);
参数:
fd:文件描述符
cmd:操作命令;
arg,lock:参数cmd对应命令使用的参数。
功能:
1. 复制一个现有的描述符(cmd=F_DUPFD). 
2. 获得/设置文件描述符标记(cmd=F_GETFD或F_SETFD). 
3. 获得/设置文件状态标记(cmd=F_GETFL或F_SETFL). 
4. 获得/设置异步I/O所有权(cmd=F_GETOWN或F_SETOWN). 
5. 获得/设置记录锁(cmd=F_GETLK , F_SETLK或F_SETLKW).
返回值:
如果出错,所有命令都返回-1,如果成功则返回某个特定值。下列三个命令有特定返回值:F_DUPFD , F_GETFD ,
F_GETFL以及F_GETOWN。   
F_DUPFD   返回新的文件描述符。   
F_GETFD   返回相应标志。



猜你喜欢

转载自blog.csdn.net/qq_37192076/article/details/80778560