C语言实现socket通信TCP 程序参考


概念参考:网络通信TCP/UDP——学习笔记

实现效果:

先运行服务端,再运行客户端。连接完毕,客户端可以发送消息。
在这里插入图片描述
客户端发送了 “1”,服务端收到消息并打印,此时轮到服务端发送消息。
在这里插入图片描述
服务端发送消息“2”,客户端收到消息也进行打印,之后不断重复。
在这里插入图片描述

补充说明:

在客户端/服务端等待对方发送消息的同时,并没有限制其继续输入消息。所以会有下图的这种效果,等待过程中发送的消息会在对方发送消息后,给对方发送过去。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
全部收完后,又恢复刚开始的样子。(可能会存在上限【类似缓冲区的东西(猜测)】,有待测试)

代码如下:

代码中使用了gets,可以更改为 fgets(buf,1000,stdin);
服务端 server.c

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

int main()
{
    printf("服务器创建socket...\n");
    int sockfd = socket(AF_INET,SOCK_STREAM,0);
    if(0 > sockfd)
    {
        perror("socket");
        return -1;
    }

    printf("准备地址...\n");
    struct sockaddr_in addr = {};
    addr.sin_family = AF_INET;
    addr.sin_port = htons(7777);
    addr.sin_addr.s_addr = inet_addr("127.0.0.1");
    socklen_t len = sizeof(addr);

    printf("绑定socket与地址...\n");
    if(bind(sockfd,(struct sockaddr*)&addr,len))
    {
        perror("bind");
        return -1;
    }

    printf("设置监听...\n");
    if(listen(sockfd,5))
    {
        perror("listen");
        return -1;
    }

    printf("等待客户端连接...\n");
    for(;;)
    {
        struct sockaddr_in addrcli = {};
        int clifd = accept(sockfd,(struct sockaddr*)&addrcli,&len);
        if(0 > clifd)
        {
            perror("accept");
            continue;
        }

        if(0 == fork())
        {
            char buf[1024] = {};
            for(;;)
            {
                printf("read:");
                read(clifd,buf,sizeof(buf));
                printf("%s\n",buf);
                if(0 == strcmp("quit",buf))
                {
                    close(clifd);
                    return 0;
                }
                printf(">");
                gets(buf);
                write(clifd,buf,strlen(buf)+1);
            }
        }
    }
}

客户端 client.c

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

int main()
{
    printf("服务器创建socket...\n");
    int sockfd = socket(AF_INET,SOCK_STREAM,0);
    if(0 > sockfd)
    {
        perror("socket");
        return -1;
    }

    printf("准备地址...\n");
    struct sockaddr_in addr = {};
    addr.sin_family = AF_INET;
    addr.sin_port = htons(7777);
    addr.sin_addr.s_addr = inet_addr("127.0.0.1");
    socklen_t len = sizeof(addr);

    printf("绑定连接服务器...\n");
    if(connect(sockfd,(struct sockaddr*)&addr,len))
    {
        perror("bind");
        return -1;
    }

    for(;;)
    {
            char buf[1024] = {};
            printf(">");
            gets(buf);
            write(sockfd,buf,strlen(buf)+1);
            if(0 == strcmp("quit",buf))
            {
                printf("通信结束!\n");
                break;
            }
            printf("read:");
            read(sockfd,buf,sizeof(buf));
            printf("%s\n",buf);
    }
    close(sockfd);
}

Author: Ikaros
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint polocy. If reproduced, please indicate source Ikaros !
评论
 Previous
gSOAP安装配置+使用案例参考+参考链接 gSOAP安装配置+使用案例参考+参考链接
环境搭建与配置gSOAP下载地址:https://sourceforge.net/projects/gsoap2/files/相关配置参考:gsoap_2.8.33.zip安装与编译配置完成后,根据官网文档:https://www.geni
2019-11-25
Next 
HTML发送表单给python处理——Linux HTML发送表单给python处理——Linux
操作系统: CentOS7环境搭建: 需要 Apache,Pythoncentos7 apache 安装配置步骤Centos7安装Python3.7,补充,将python解压后放入/usr/local/python3下。然后升级pip3,之
2019-11-08
  TOC