端口号:
端口号: 16位数值(unsigned short ) //0~65535 (65536个数)
//标示一个进程
TCP和 UDP 的端口号是独立的
端口号:
(1)
作用:唯一的标识一个进程
每一个应用程序进程有一个端口号,
通讯时区分数据包属于哪个应用程序进程
http协议用到的端口号:80
在配置tcp和udp通信的地址和端口号时,因为
1.网络协议在底层使用二进制格式来表示数据。IP地址和端口号在内存中以二进制形式存储,以便于计算机处理和网络设备识别。
2.不同的计算机系统可能使用不同的字节序(大端或小端)。使用这些转换函数可以确保数据在不同系统间传输时保持一致性。
udp:特点:无连接、不可靠
tcp:特点:面向连接、可靠传输
使用udp进行模拟通信的过程:
客户端:socket --- > //fgets(实现多次通信)----> sendto ----> recvfrom ---->printf
服务器端:socket --->bind ----> recvfrom //保存了客户端的地址 srcaddr----> sprintf ---->sendto // srcaddr
2.查看地址
//linux
ifconfig //查看网卡相关信息 --- 包含ip地址
//windows 下 cmd
ipconfig /all
tcp的c/s架构模拟:
1.建立连接(socket --->bind ---> listen --->accept)
2.通信过程(read --->write --->close)
tcp如何建立连接:
tcp三次握手:
客户端 服务器
-----我要和你建立连接--->
<----好的,可以建立连接--
-----好 ---------------->
断开连接:
tcp四次挥手:
客户端 服务器
-----我要和你断开连接--->
<----好的,可以断开------
<----我也要断开----------
-----好 ---------------->
函数原型:
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
功能:该函数固定有客户端使用,表示从当前主机向目标
主机发起链接请求。
参数:sockfd 本地socket创建的套接子id
addr 远程目标主机的地址信息。
addrlen: 参数2的长度。
返回值:成功 0
失败 -1
练习:
使用tcp协议,实现server收到信息后回发
server
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include<stdio.h>
#include <string.h>
#include <unistd.h>
int main(int argc,char *argv[])
{
int listen_fd = socket(AF_INET,SOCK_STREAM,0);
struct sockaddr_in seraddr;
seraddr.sin_family = AF_INET;
seraddr.sin_port = htons(50000);
seraddr.sin_addr.s_addr = inet_addr("192.168.206.128");
if(bind(listen_fd,(const struct sockaddr*)&seraddr,sizeof(seraddr)) < 0)
{
perror("bind fail");
return -1;
}
if(listen(listen_fd,5) < 0)
{
perror("listen error");
return -1;
}
int connfd = accept(listen_fd,NULL,NULL);
if(connfd < 0)
{
perror("accept error");
return -1;
}
printf("connfd = %d\n",connfd);
char buf[1024];
char buf1[1024];
while(1)
{
read(connfd,buf,sizeof(buf));
sprintf(buf1,"server + %s\n",buf);
write(connfd,buf1,strlen(buf1)+1);
printf("%s\n",buf);
}
return 0;
}
client
#include <stdio.h>
int main(int argc,char *argv[])
{
int soc_fd = socket(AF_INET,SOCK_STREAM,0);
if(soc_fd < 0)
{
perror("socket fail");
return -1;
}
struct sockaddr_in seraddr;
seraddr.sin_family = AF_INET;
seraddr.sin_port = htons(50000);
seraddr.sin_addr.s_addr = inet_addr("192.168.206.128");
struct sockaddr_in srcaddr;
socklen_t addrlen = sizeof(srcaddr);
if (connect(soc_fd,(const struct sockaddr*)&seraddr,sizeof(seraddr)) < 0)
{
perror("connect fail");
}
char buf[1024];
char buf1[1024];
while(1)
{
fgets(buf,sizeof(buf),stdin);
write(soc_fd,buf,strlen(buf)+1);
read(soc_fd,buf,sizeof(buf));
printf("%s\n",buf);
}
return 0;
}