前言
虚拟机类型:Ubuntu 20.04.1,代码编写:vs code
windows连接工具NetAssist:链接:https://pan.baidu.com/s/1e3dKPh7N5bo0dli84O_TuA?pwd=mndp
提取码:mndp
前提:会C语言
提示:以下是本篇文章正文内容,下面案例可供参考
目标与安排
为什么要学习网络编程:
实践必备技能
时代必备技能:
几乎所有的操作系统都支持网络功能
几乎所有的app都要联网才能工作
互联网时代->移动互联网时代->物联网时代…
课程目标:
掌握网络协议的本质和socket的本质
掌握C/S等模型
掌握TCP和UDP网络编程…
Are You ready?
Let`s go!
网络编程核核心概念与模式
如何进行网络编程?
使用操作系统的接口函数,使得程序具备网络数据收发的能力
本质:
只是一系列的系统函数的花哨玩法
网络编程是特定领域的C语言程序设计
核心概念
协议:为数据通信而预定的规则
地址:用于表示设备的整数值
端口号:
设备的收发数据而指定的整数值,用于标识具体连接
角色:
客户端:发起连接的设备
服务端:等待连接的设备
网络编程模式:
1、准备网络连接 2、连接运程设备 3、收发数据 4、关闭连接
初探网络编程接口
int socket(int dimain,int type,int protocal);创建套接字,为网络连接做准备 int connect(int sock,struct sockaddr* addr,socklen_t len);连接远程设备 ssize_t send(int fd,const void *buf,size_t n,int flags);发送数据到远程设备 ssize_t recv(int fd,void *buf,size_t n,int flags);接受数据 int close(int fd);关闭连接,销毁套接字
客户端编程初体验
注:远端ip地址为:47.103.24.173(bilibili.com),端口号80
//头文件 #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>
定义socket变量int sock = 0;
定义sockaddr_instruct sockaddr_in addr = {0};
定义发送的内容char * tosend = "Get\n\n";注意:发送的内容最后需要2次换行,服务端才会理你
定义接受缓冲区:char buf[128]={0};
以及接受发送,循环控制变量int len = 0;int r = 0;
创建socket并判断
sock = socket(PF_INET, SOCK_STREAM, 0); if( sock == -1 ) { printf("socket error\n"); return -1; }
赋值sockaddr_in
addr.sin_family = AF_INET;//和socket创建的参数1一样 addr.sin_addr.s_addr = inet_addr("47.103.24.173");//ip地址 addr.sin_port = htons(80);//端口号
连接:
if( connect(sock, (struct sockaddr*)&addr, sizeof(addr)) == -1 ) { printf("connect error\n"); return -1; }
发送数据服务端
len = send(sock, tosend, strlen(tosend), 0); printf("send bytes = %d\n", len);
接收服务端发来的源码
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 bytes = %d\n", len);
最后不要忘记了close(sock);
此时,我们运行,屏幕上就有html的源代码显示
The End
完整代码的展示:
#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\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.103.24.173"); addr.sin_port = htons(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("send bytes = %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 bytes = %d\n", len); close(sock); return 0; }