C语言实现TCP服务器与客户端通信

         以上是TCP通信客户端与服务器实现通信的基本原理流程图。

1、客户端的实现(4个步骤)

1.1创建socket对象

1.2请求连接

1.3发送数据

1.4关闭套接字

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<arpa/inet.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<netinet/ip.h>
#include<sys/types.h>

int main(int argc,char *argv[])
{
    //入参判断
    if(argc < 2)
    {
        printf("参数有误");
        return -1;
    }
    //1.创建socket对象(流式套接字)
    //2.设置服务器端的ip地址和接口
    //3.请求连接
    //4.发送数据
    //5.关闭socket对象
    
    //1.创建socket对象(流式套接字)
    int tcp_socket = socket(AF_INET,SOCK_STREAM,0);
    if(tcp_socket < 0)
    {
        perror("socket error");
        return -1;
    }

    //1.1设置服务器端的ip地址和端口号
    //定义结构体并为其赋值
    struct sockaddr_in server;
    server.sin_family = AF_INET;//IPV4协议
    server.sin_port = htons(atoi(argv[2]));//端口号
    server.sin_addr.s_addr = inet_addr(argv[1]);//网络字节序

    //2.请求连接
    if(connect(tcp_socket,(struct sockaddr *)&server,sizeof(server)) < 0)
    {
        perror("connect error");
        return -1;
    }

    //3.发送消息
    char buf[20] = {0};
    printf("tftp>");
    fgets(buf,sizeof(buf),stdin);//从键盘写入数据到缓冲区
    send(tcp_socket,buf,strlen(buf),0);//将缓冲区的数据写入socket
    //4关闭socket对象
    close(tcp_socket);
    return 0;
}

提示:ip地址和端口号均采用主函数传参的方式输入。加入步骤3的目的是为了用发送消息的方式检验是否能正常通信。具体的每个函数中所用到的参数就不做详细的介绍了可利用(man 函数名)的方式查询。

2. 服务器的实现(6个步骤)

2.1创建socket对象

2.2绑定套接字

2.3启动监听

2.4接收连接请求

2.5接收客户端数据

2.6关闭socket对象

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<arpa/inet.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<netinet/ip.h>
#include<sys/types.h>

int main(int argc,char *argv[])
{
    //入参判断
    if(argc < 3)
    {
        printf("参数有误");
        return -1;
    }
    //1.创建socket对象(流式套接字)    socket()
    //2.设置服务器端的ip地址和端口号  struct sockaddr_in
    //3.绑定自己的ip地址和端口号      bind()
    //4.监听socket对象                listen()
    //5.接受连接                      accept()
    //6.接受连接后进行操作
    //7.关闭socket对象                close()
    
    //1.创建socket对象(流式套接字)
    int socket_fd = socket(AF_INET,SOCK_STREAM,0);
    if(socket_fd < 0)
    {
        perror("socket error");
        return -1;
    }

    //1.1设置服务器端的ip地址和端口号
    //定义结构体并为其赋值
    struct sockaddr_in server;
    server.sin_family = AF_INET;//IPV4协议
    server.sin_port = htons(atoi(argv[2]));//端口号
    server.sin_addr.s_addr = inet_addr(argv[1]);//网络字节序

    //2.绑定自己的ip地址和端口号
    if(bind(socket_fd,(struct sockaddr *)&server,sizeof(server)) < 0)
    {
        perror("bind error");
        return -1;
    }

    //3.监听socket对象
    int ret = listen(socket_fd,5);
    if(ret < 0)
    {
        perror("listen error");
        return -1;
    }

    //4.接收连接
    int newfd =  0;//接收新的socket对象
    struct sockaddr_in client;
    int len = sizeof(client);
    newfd = accept(socket_fd,(struct sockaddr *)&client,&len);//通过参数2 获得客户端信息
    if(newfd < 0)
    {
        perror("accept error");
        return -1;
    }
    //输出客户端信息
    printf("cilent ip=%s port=%d\n",inet_ntoa(client.sin_addr),ntohs(client.sin_port));

    //5.接收数据
    char buf[20] = {0};
    recv(newfd,buf,sizeof(buf),0);
    printf("%s\ny",buf);
    //6.关闭socket对象
    close(newfd);

提示:在连接成功后会产生一个新的socket对象newfd,在之后的操作中用的是newfd而不是最开始创建的socket_fd。

  • 1
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值