运输层。
在OSI模型中ARP协议属于链路层;而在TCP/IP模型中,ARP协议属于网络层,ARP分层的位置是TCP/IP的网络层。实际上对网络接口层的以太网帧来讲,同样是帧的上层协议,当收到以太帧时,根据帧的协议字段判断是送到ARP还是IP。
扩展资料:
注意事项:
tcp服务器一般情况下都需要绑定,否则客户端找不到这个服务器,更无法连接到服务器
tcp服务器一般情况下都需要绑定,否则客户端找不到这个服务器,更无法连接到服务器。
tcp服务器中通过listen可以将socket创建出来的主动套接字变为被动的,这是做tcp服务器时必须要做的。
当客户端需要链接服务器时,就需要使用connect进行链接,udp是不需要链接的而是直接发送,但是tcp必须先链接,只有链接成功才能通信。
参考资料来源:百度百科-TCP
参考资料来源:百度百科-OSI
TCP指的是传输控制协议。它是一种面向连接导向的、可靠地及基于字节流的运输层通信协议。而在接触TCP中还有UDP,UDP也是一项重要的传输协议。TCP提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另一端1、提供IP环境下的数据可靠传输(一台计算机发出的字节流会无差错的发往网络上的其他计算机,而且计算机A接收数据包的时候,也会向计算机B回发数据包,这也会产生部分通信量),有效流控,全双工操作(数据在两个方向上能同时传递),多路复用服务,是面向连接,端到端的传输;
2、面向连接:正式通信前必须要与对方建立连接。事先为所发送的数据开辟出连接好的通道,然后再进行数据发送,就像打电话。
3、TCP支持的应用协议:FTP 文件传送、RLogin 远程登录、SMTP POP3 电子邮件、NFS 网络文件系统、远程打印、远程执行、名字服务器终端服务器等服务类型。
该服务器完成将客户端发送的内容转换成大写,并发送到客户端(注意:服务器只支持一个客户端连接,后面我们会使用多进程,多线程,select,poll,epoll来完善我们的服务器,使之支持多个客户端连接)
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>
#include <ctype.h>
#define SERV_PORT 7000
//running command: "./server_tcp -p 7001"
int main(int argc, char** argv)
{
int opt
int port = SERV_PORT
while((opt = getopt(argc, argv, "p:")) != -1){
switch (opt){
case 'p': port = atoi(optarg)
break
default: break
}
}
struct sockaddr_in serv_addr, clnt_addr
socklen_t clnt_len
int lfd, cfd
int n, i
char buf[BUFSIZ]
lfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)
if(lfd <0){
printf("%s\n", "socket error")
exit(1)
}
serv_addr.sin_family = AF_INET
serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1")
serv_addr.sin_port = htons(port)
bind(lfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr))
listen(lfd, 128)
clnt_len = sizeof(serv_addr)
cfd = accept(lfd, (struct sockaddr*)&clnt_addr, &clnt_len)
if(cfd == -1){
printf("accept error\n")
if(errno == EAGAIN || errno == EWOULDBLOCK){
printf("normal error")
}else{
printf("innormal error\n")
return -1
}
}
while(1){
n = read(cfd, buf, BUFSIZ)
if(n >0){
printf("receive centent: %s\n", buf)
for(i = 0i <ni++){
buf[i] = toupper(buf[i])
}
}
write(cfd, buf, n)
}
close(cfd)
close(lfd)
return 0
}
客户端可以省略,使用nc命令可以模拟客户端连接: nc 127.1 7001
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
int main()
{
struct sockaddr_in serv_addr
int lfd
lfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)
serv_addr.sin_family = AF_INET
serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1")//服务器和客户端IP相同
serv_addr.sin_port = htons(6666)
connect(lfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr))
write(lfd, "hello socket", strlen("hello socket"))
char rbuf[BUFSIZ]
read(lfd, rbuf, BUFSIZ)
printf("rbuf=%s\n", rbuf)
close(lfd)
return 0
}
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)