当前位置:网站首页>网络通信与Socket编程概述
网络通信与Socket编程概述
2022-08-04 05:31:00 【小羊的预备程序员】
目录
1、Socket通信3要素
①通信的目的地址(ip地址,例如有时候不知道域名ip地址可以通过nslookup查询)
②使用的端口号(例如http 80 、smtp 25)
③使用的传输层协议(如TCP、UDP)
2、Socket通信模型
操作系统已经将具体通信的细节实现了封装,具体实现发送数据有一个详细的流程,操作系统就像一个代理,我们只需要将具体内容准备好,还有ip地址和端口号标记好就可以连接到服务器端
具体流程:
客户端:
传输层:使用TCP/UDP协议
网络层:通过IP地址寻找到服务器
数据链路层:通过电信/联通的网络发送出去
服务器端:
也是通过操作系统代理,将数据包一层层传给应用接口
数据链路层:从网络网卡接入数据包
网络层:进行校验(看这个包应该投递给那个应用)
传输层:传输到应用层接口
3、第一个服务器入门项目
项目需求:实现回声服务器的客户端/服务端程序,客户端通过网络连接到服务器,并发送一串英文信息,服务器端接受信息后,将每个字符转换为大写并回送给客户端显示。
下面附上源码:
echo_server.c:
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <ctype.h>
#include <arpa/inet.h>
#define SERVER_PORT 666
int main(void){
int sock;//代表信箱
struct sockaddr_in server_addr;
//1.美女创建信箱
sock = socket(AF_INET, SOCK_STREAM, 0);
//2.清空标签,写上地址和端口号
bzero(&server_addr, sizeof(server_addr));
server_addr.sin_family = AF_INET;//选择协议族IPV4
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);//监听本地所有IP地址
server_addr.sin_port = htons(SERVER_PORT);//绑定端口号
//实现标签贴到收信得信箱上
bind(sock, (struct sockaddr *)&server_addr, sizeof(server_addr));
//把信箱挂置到传达室,这样,就可以接收信件了
listen(sock, 128);
//万事俱备,只等来信
printf("等待客户端的连接\n");
int done =1;
while(done){
struct sockaddr_in client;
int client_sock, len, i;
char client_ip[64];
char buf[256];
socklen_t client_addr_len;
client_addr_len = sizeof(client);
client_sock = accept(sock, (struct sockaddr *)&client, &client_addr_len);
//打印客服端IP地址和端口号
printf("client ip: %s\t port : %d\n",
inet_ntop(AF_INET, &client.sin_addr.s_addr,client_ip,sizeof(client_ip)),
ntohs(client.sin_port));
/*读取客户端发送的数据*/
len = read(client_sock, buf, sizeof(buf)-1);
buf[len] = '\0';
printf("receive[%d]: %s\n", len, buf);
//转换成大写
for(i=0; i<len; i++){
/*if(buf[i]>='a' && buf[i]<='z'){
buf[i] = buf[i] - 32;
}*/
buf[i] = toupper(buf[i]);
}
len = write(client_sock, buf, len);
printf("finished. len: %d\n", len);
close(client_sock);
}
close(sock);
return 0;
}
echo_client.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#define SERVER_PORT 666
#define SERVER_IP "127.0.0.1"
int main(int argc, char *argv[]){
int sockfd;
char *message;
struct sockaddr_in servaddr;
int n;
char buf[64];
if(argc != 2){
fputs("Usage: ./echo_client message \n", stderr);
exit(1);
}
message = argv[1];
printf("message: %s\n", message);
sockfd = socket(AF_INET, SOCK_STREAM, 0);
memset(&servaddr, '\0', sizeof(struct sockaddr_in));
servaddr.sin_family = AF_INET;
inet_pton(AF_INET, SERVER_IP, &servaddr.sin_addr);
servaddr.sin_port = htons(SERVER_PORT);
connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr));
write(sockfd, message, strlen(message));
n = read(sockfd, buf, sizeof(buf)-1);
if(n>0){
buf[n]='\0';
printf("receive: %s\n", buf);
}
else {
perror("error!!!");
}
printf("finished.\n");
close(sockfd);
return 0;
}
边栏推荐
- (导航页)OpenStack-M版-双节点手工搭建-附B站视频
- AWS使用EC2降低DeepRacer的训练成本:DeepRacer-for-cloud的实践操作
- Tensorflow/Pytorch安装(Anaconda环境下,无版本冲突,亲测有效)
- LeetCode_Dec_2nd_Week
- tmux概念和使用
- Copy攻城狮的年度之“战”|回顾2020
- AWS uses EC2 to reduce the training cost of DeepRacer: DeepRacer-for-cloud practical operation
- [Copy Siege Lion Log] Flying Pulp Academy Intensive Learning 7-Day Punch Camp-Study Notes
- LeetCode_Nov_4th_Week
- 深度学习理论——过拟合、欠拟合、正则化、优化器
猜你喜欢
Shell脚本执行的三种方式
LeetCode_Nov_4th_Week
file permission management ugo
Tencent and NetEase have taken action one after another. What is the metaverse that is so popular that it is out of the circle?
文件权限管理 ugo
Copy Siege Lion 5-minute online experience MindIR format model generation
(位操作符)按位与、按位或、按位异或
最全的最详细的指针讲解(C语言)
LeetCode_Dec_2nd_Week
Copy攻城狮的年度之“战”|回顾2020
随机推荐
How to get started with MOOSE platform - an example of how to run the official tutorial
Postgresql snapshot
MNIST Handwritten Digit Recognition - Building a Perceptron from Zero for Two-Classification
arm交叉编译
【Copy攻城狮日志】飞浆学院强化学习7日打卡营-学习笔记
(Navigation page) OpenStack-M version - manual construction of two nodes - with video from station B
第三章 标准单元库(上)
(导航页)OpenStack-M版-双节点手工搭建-附B站视频
counting cycle
Shell脚本执行的三种方式
安装MySQL的详细步骤
The usefulness of bind() system call
LeetCode_Nov_1st_Week
Question 1000: Input two integers a and b, calculate the sum of a+b, this question is multiple sets of test data
深度学习理论——过拟合、欠拟合、正则化、优化器
[Development miscellaneous][Debug]debug into kernel
Golang environment variable settings (2)--GOMODULE & GOPROXY
深度学习理论 —— 初始化、参数调节
MySQL批量修改时间字段
[English learning][sentence] good sentence