linux网络通信-----TCP协议

首先要了解TCP的通信原理

在网络通信中,我们往往会用到不同的网络协议,有TCP,UDP,ICMP,IP,IGMP...
为了我们使用网络通信方便,Linux采用socket(套接字)来连接不同协议的接口,就相当于是在中间加入了一个交换机,自动把不同的网络连起来一样。这样我们就可以在不同的网络协议中用相同的函数了。

TCP编程模型
TCP通信需要服务器和客户端双方进行通信
首先服务器需要:创建socket,绑定地址,监听端口,等待连接,收发数据,结束连接
客户端需要:创建socket,连接服务器,收发数据,结束连接

创建socket   socket
绑定地址   bind
监听端口   listen
等待连接   accept
收发数据   send/revc
结束连接   close
连接服务器   connect
具体使用方法没必要去man一个函数,查找UNIX环境高级编程即可

在一个电脑同时开两个虚拟机
把Redhat作为服务器,把ubuntu作为客户端
服务器代码
#include
#include
#include
#include
#include

#define portnum 3333

int main()
{
    int sockfd,new_fd;
    struct sockaddr_in server_addr;
    struct sockaddr_in client_addr;
    char buffer[128];
    int nbyte;
    int sin_size;
     
    //创建socket
    if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
    {
    printf("create socket error\n");
    exit(1);
    }
     
    //设置要绑定的地址
    bzero(&server_addr, sizeof(struct sockaddr_in));//清零
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(portnum);
    server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
     
    //绑定地址
    bind(sockfd, (struct sockaddr *)(&server_addr), sizeof(struct sockaddr_in));
     
    //监听端口
    listen(sockfd, 5);;
     
    while(1)
    {
    //等待连接
    sin_size = sizeof(struct sockaddr);
    new_fd = accept(sockfd, (struct sockaddr *)(&client_addr), &sin_size);
     
    printf("server get connect from %s\n", inet_ntoa(client_addr.sin_addr));
     
    //接收数据
    nbyte = recv(new_fd, buffer, 128, 0);
    buffer[nbyte] = '\0';
     
    printf("server received %s \n", buffer);
     
    //结束连接
    close(new_fd);
    }
 
    close(sockfd);
     
    return 0;
}






客户端代码
#include
#include
#include
#include
#include

#define portnum 3333

int main()
{
    int sockfd; 
    struct sockaddr_in server_addr;
    char buffer[128];
     
    //创建套接字
    if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
    {
    printf("create socket error\n");
    exit(1);
    }
     
    //设置要连接的服务器的地址
    bzero(&server_addr, sizeof(struct sockaddr_in));//清零
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(portnum);
    server_addr.sin_addr.s_addr = inet_addr("192.168.146.129");
     
     
    //连接服务器
    if ( connect(sockfd, (struct sockaddr *)(&server_addr), sizeof(struct sockaddr)) == -1)
    {
    printf("connect error\n");
    exit(1);
    }
     
    //发送数据到服务器
    printf("please input char:\n");
    fgets(buffer, 128, stdin);
    send(sockfd, buffer, strlen(buffer), 0);
     
    //关闭连接
    close(sockfd);
     
    return 0;
}


在Redhat运行服务器
linux网络通信-----TCP协议

在ubuntu运行客户端
linux网络通信-----TCP协议


回车后在Redhat显示
linux网络通信-----TCP协议
数据接收完成

这里面还有一些特殊的函数是用来把数据转化为网络字节序的,或者是把字符型IP和整数型IP之间进行转化
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值