理解网络编程和套接字
-
概念
网络编程:编写程序使两台计算机之间相互交换数据
套接字:网络数据传输用的软件设备(socket)
Linux中的socket:在Linux的世界里,socket也被认为是文件的一种,因此在网络传输过程中自然也可以使用文件I/O的相关函数。
Windows中的socket:Windows中的socket和文件是区分的,需要调用特殊的数据传输函数。
底层文件和文件描述符:“底层” 是与标准无关的操作系统独立提供的。文件描述符是文件和套接字一般经过创建过程就会被分配描述符(描述符为一个数字),每创建一个对象就会有一个描述符,而底层文件即使没有经过特殊的创建过程,程序一旦开始运行后也会被自动分配文件描述符(相当于Windows中的文件句柄)。
-
文件描述符例子
vim low_open.c
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
void error_handling(char * message);
int main(void)
{
int fd;
char buf[] = "Let`s go!\n";
// 组合打开模式:O_CREAT不存在创建之,O_WRONLY只写模式,O_TRUNC若不空则清空。
fd = open("data.txt", O_CREAT|O_WRONLY|O_TRUNC);
if(fd == -1)
error_handling("open() error!");
printf("文件描述符:%d\n", fd);
if(write(fd, buf, sizeof(buf)) == -1)
error_handling("write() error!");
close(fd);
return 0;
}
void error_handling(char *message)
{
fputs(message, stderr);
fputs("\n", stderr);
exit(1);
}
编译测试 :
gcc low_open.c -o low_open
./low_open
结果:
文件描述符:3
-
文件描述符与套接字例子
vim fd_seri.c
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/socket.h>
int main(void)
{
int fd1, fd2, fd3;
fd1=socket(PF_INET, SOCK_STREAM, 0);
fd2=open("test.data", O_CREAT|O_WRONLY|O_TRUNC);
fd3=socket(PF_INET, SOCK_STREAM, 0);
printf("文件描述1: %d\n", fd1);
printf("文件描述2: %d\n", fd2);
printf("文件描述3: %d\n", fd3);
close(fd1);
close(fd2);
close(fd3);
return 0;
}
编译运行
//编译:
gcc fd_seri.c -o fd_seri
//运行:
./fd_seri
//结果:
文件描述1: 3
文件描述2: 4
文件描述3: 5
-
标准IO描述符
通过上面的例子可以看出,套接字和文件都是使用同一个描述符,而且描述符是从3开始顺序排列的,而0——2的描述符是操作系统预留给标准IO的描述符。
文件描述符 对象 0 标准输入:Standard Input 1 标准输出:Standard Output 2 标准错误:Standard Error
问题
-
套接字在网络编程中的作用?为何要称它为套接字?
套接字是为了网络中互相传输数据而编程使用的的软件设备。称为套接字就想电网的插座一样,只要插到插座上就可以获取电网的电,同理套接字就是连接到因特网的工具。
-
创建套接字后要给它分配地址,为什么?为了完成分配地址一般要调用哪个函数?
创建套接字要分配地址的目的是为了让网络中的其它计算机可以通过此地址连接到本计算机,使用socket()函数来完成套接字的创建