网络编程和套接字

1、什么是网络编程?
就是编写程序使两台联网的计算机能够相互交换数据,这就是全部的意义,看起来很简单。完成这些需要电缆等硬件的支持,而操作系统提供的套接字就是需要的软件设备,完成数据传输。

2、基本过程
我们可以把套接字看成固定电话机,一个用的是互联网,一个是电话网,套接字和电话机一样,大致分成两种,即接听和拨打。我们先来看用于接听的套接字创建过程。(服务器端)
(1)、socket函数创建套接字,(相当于购买一个电话机)
#include<sys/socket.h>
int socket(int domain,int type,int protocol);
(2)、bind函数给套接字分配地址信息,包括IP地址和端口号(相当于给电话机分配电话号码)
#include <sys/socket.h>
int bind(int sockfd, struct sockaddr *myaddr, socklen_t addrlen); // 书上的
int bind(int socket, const struct sockaddr *address,
socklen_t address_len); // man手册上的
// 成功时返回0,失败时返回-1
(3)、listen函数转换为可接受连接的状态(相当于连接电话线)
#include <sys/socket.h>
int listen(int sockfd, int backlog); // 书上的
int listen(int socket, int backlog); // man手册
// 成功时返回0,失败时返回-1

(4)accept受理连接请求(相当于拿起话筒接听)
#include <sys/socket.h>
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen) // 书上的
int accept(int socket, struct sockaddr *restrict address,
socklen_t *restrict address_len); // man手册上的

我们再来看看用于拨打的套接字创建过程(客户端),相对于服务器端简单。
只有两个步骤:(1)、socket函数创建套接字,(2)、connect函数请求连接。

3、在Linux平台上运行
编译:(gcc是Linux平台下GNU编译器集合)
gcc hello_server.c -o hserver // 编译源文件并生成可执行文件hserver
gcc hello_client.c -o hclient // 编译源文件并生成可执行文件hclient
执行:

终端1

$ ./hserver 9190
正常情况下程序将停留在此状态,因为服务器端调用的accept函数还未返回。
运行客户端
$ ./hclient 127.0.0.1 8888
Message from server: Hello World!
$
如果想再次运行服务器端,需要修改端口号9190。

4、基于Linux的文件操作
为什么要知道文件操作,因为在Linux里,socket也是文件的一种,可以使用文件I/O相关的函数,而Windows是区分二者的,所以完成数据传输需要调用特殊的函数。
底层文件访问(Low-Level File Access)和文件描述符(File Descriptor)
“底层”可以理解为“与标准无关的操作系统独立提供的”。稍后讲解的函数是Linux提供的,而非ANSI标准定义的函数。
文件描述符是系统分配给文件或套接字的整数。文件和套接字一般经过创建过程才会被分配文件描述符。
(1)打开文件
open函数需传递两个参数:第一个参数是打开的目标文件名及路径信息,第二个参数是文件打开模式。
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int open(const char *path, int flag);
// 成功是返回文件描述符,失败时返回-1。
(2)关闭文件
使用文件后必须关闭,关闭文件时调用close函数:
#include <unistd.h>
int close(int fd);
(3)数据写入文件:使用write函数向文件输出(传输)数据:
#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t nbytes);fd是文件描述符,buf是缓冲值地址,最后是字节数。
(4)read函数用来输入(接受)数据:
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t nbytes);

5、windows平台运行
windows下很多套接字和LINUX下类似,因为大多数服务器运行在linux端,客户端运行在windows下,并且有可能在二者切换,所以二者都需要掌握。
要用windows运行网络程序,需要三点条件:
导入头文件 winsock2.h
链接ws2_32.lib库
windows初始化
接下来的操作和上面类似,就不详细介绍了。

具体的代码可以在github上找到,在这里推荐一个链接(https://github.com/katoluo/TCP-IP-Network-Programing/)

猜你喜欢

转载自blog.csdn.net/weixin_53344209/article/details/114016607