1、课程目标:以 Linux 系统为主要平台,从 0 掌握 socket 网络编程
- 掌握网络协议的本质以及 socket 网络编程
- 掌握网络编程基础模型,如:C / S
- 掌握 TCP 和 UDP 应用编程
- 不同平台网络编程实践
2、课程安排
- socket 接口与 TCP 和 UDP 编程(数据收发)
- 通信协议设计与实现
3、网络编程的本质:使用操作系统提供的接口函数,使得应用程序具备收发网络数据的能力
应用程序如何通过内核去使用硬件?通过系统自带的接口函数。
操作系统内核可以直接管理硬件,应用程序通过操作系统提供的接口函数(让内核去操作硬件)来进行数据的收发。
- 网络编程核心概念
— 协议:为进行数据通信而预定义的数据规则
— 地址:网络通信中的用于标识设备的整数值例:192.168.3.166
— 端口号:设备为收发数据而指定的数值,用于标识具体连接。可理解为:设备中用于数据通信的数据通道 - 角色
服务端:等待连接的设备
客户端:发起连接的设备
GET /index.html HTTP/1.1
HOST: www.dt4sw.com
User-Agent: TEST
Connection: close
网址就是IP地址吗?URL是什么,域名又是什么?
答:网址不是 IP 地址,是网络信息资源的地址(如:具体网页的地址):即URL(Uniform Resource Locator)
IP 地址(Internet Protocal Adress)
:网络设备的地址
域名是 IP 地址的别名,多个域名可指向同一个 IP 地址
1、创建套接字,为网络连接做准备
2、指定远程设备的IP地址
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
int main()
{
int sock = 0;
struct sockaddr_in addr = {0};
char* tosend = "GET /index.html HTTP/1.1\nHOST: www.dt4sw.com\nUser-Agent: TEST\nConnection: close\n\n";
int len = 0;
char buf[128] = {0};
int r = 0;
sock = socket(PF_INET, SOCK_STREAM, 0);
if(sock == -1)
{
printf("socket error\n");
return -1;
}
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr("47.99.217.175"); //将IP地址字符串转化成符合网络字节序的整型值
addr.sin_port = htons(80); //将80本地字节序转化成网络字节序
if( connect(sock, (struct sockaddr*)&addr, sizeof(addr)) == -1)
{
printf("connect error\n");
return -1;
}
printf("connect success\n");
len = send(sock, tosend, strlen(tosend), 0);
printf("len = %d\n", len);
len = 0;
do
{
int i = 0;
r = recv(sock, buf, sizeof(buf), 0);
if(r > 0)
{
len += r;
}
for(i = 0; i < r; i++)
{
printf("%c", buf[i]);
}
}while(r > 0);
printf("\n");
printf("recv byte = %d\n", len);
close(sock);
return 0;
}