上次我们了UDP编程,今天我们说一下TCP编程;
在TPC/IP协议的传输层中,有UDP协议和TPC协议,这二者的区别如下:
1.不安全不可靠的传输方式
2.UDP资源开销小,实现机制简单
3.UDP是无连接的
UDP | 不安全,不可靠 | 资源开销小,(包头8字节) | 实现机制简单(只管发送) | 无连接 |
TCP | 安全可靠(三次握手,四次挥手) | 资源开销大 | 实现机制复杂(确保发送成功) |
IPC协议的编程方式:
发送端:
1.创建套接字(socket)
2.发送三次握手连接请求 (connect)
3.发送(send)
4.接收(recv)
5.关闭套接字(close)
接收端:
1.创建套接字(socket)
2.绑定(bind)
3.监听,让三次握手排队等待(listen)
4.处理等待的套接字(accep)
5.发送(send)
6.接收(recv)
7.关闭(close)
这里是一个主机端(接收端)的代码(头文件没有加):
int main(void)
{
int sockfd = 0;
int ret = 0;
int cnt = 0;
char temp[1024] = {0};
size_t nsize;
struct sockaddr_in myaddr;
sockfd = socket(AF_INET,SOCK_STREAM,0);
if(-1 == sockfd)
{
perror("fail to socket\n");
return -1;
}
myaddr.sin_family = AF_INET;
myaddr.sin_port = htons(40000);
myaddr.sin_addr.s_addr = inet_addr("192.168.0.177");
ret = bind(sockfd,(struct sockaddr*)&myaddr,sizeof(myaddr));
if(-1 == ret)
{
perror("fail to bind\n");
return -1;
}
ret = listen(sockfd,3);
if(-1 == ret)
{
perror("fail to listen\n");
return -1;
}
cnt = accept(sockfd,NULL,NULL);
if(-1 == cnt)
{
perror("fail to accept\n");
return -1;
}
//收发
nsize = recv(cnt,temp,sizeof(temp),0);
if(-1 == nsize)
{
return -1;
}
printf("接收到:%s\n",temp);
memset(temp,0,sizeof(temp));
fgets(temp,sizeof(temp),stdin);
temp[strlen(temp)-1] = '\0';
nsize = send(cnt,temp,strlen(temp),0);
if(-1 == nsize)
{
return -1;
}
printf("发送成功!\n");
close(cnt);
close(sockfd);
return 0;
}
这是发送端的代码:
#include "../../diaoyong.h"
int main(void)
{
int sockfd = 0;
int con = 0;
size_t nsize;
char temp[1024] = {0};
struct sockaddr_in send1;
//创建
sockfd = socket(AF_INET,SOCK_STREAM,0);
if(-1 == sockfd)
{
perror("fail to socket\n");
return -1;
}
send1.sin_family = AF_INET; //对方的信息
send1.sin_port = htons(40000);
send1.sin_addr.s_addr = inet_addr("192.168.0.119");
con = connect(sockfd,(struct sockaddr *)&send1,sizeof(send1));
if(-1 == con)
{
perror("fail to connect\n");
return -1;
}
//发送
//while(1)
//{
//memset(temp,0,sizeof(temp));
fgets(temp,sizeof(temp),stdin);
temp[strlen(temp)-1] = '\0';
nsize = send(sockfd,temp,strlen(temp),0);
if(-1 == nsize)
{
return -1;
}
printf("发送成功!\n");
//接收
memset(temp,0,sizeof(temp));
nsize= recv(sockfd,temp,sizeof(temp),0);
if(-1 == nsize)
{
return -1;
}
printf("接收到%ld个字节,内容为:%s\n",nsize,temp);
//}
close(sockfd);
return 0;
}
结束!