服务器端 客户端 之间socket通信(C实现)

 1.服务器端

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

#define PORT 2345
#define MAXSIZE 1024

int main(int argc, char *argv[])
{
    int i=1,h=2;

    printf("i + h = %d\n", i+h);

    int sockfd, newsockfd;

    //定义服务端套接口数据结构
    struct sockaddr_in server_addr;
    struct sockaddr_in client_addr;
    int sin_size, portnumber;

    //发送数据缓冲区
    char buf[MAXSIZE];

    //定义客户端套接口数据结构
    int addr_len = sizeof(struct sockaddr_in);

    //创建socket接口
    //协议族 AF_INET:TCP/IP – IPv4
    if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){
        fprintf(stderr, "create socket failed\n");
        exit(EXIT_FAILURE);
    }

    puts("create socket success");
    printf("socket is %d\n", sockfd);

    //清空表示地址的结构体变量
    bzero(&server_addr, sizeof(struct sockaddr_in));

    //设置addr的成员变量信息
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(PORT);

    //设置ip为本机ip
    server_addr.sin_addr.s_addr = htonl(INADDR_ANY);

    //绑定端口
    if(bind(sockfd, (struct sockaddr*)(&server_addr), sizeof(struct sockaddr)) < 0){
        fprintf(stderr, "bind failed\n");
        exit(EXIT_FAILURE);
    }

    puts("bind success\n");

    //监听端口
    if(listen(sockfd, 10) < 0){
        perror("listen fail\n");
        exit(EXIT_FAILURE);
    }

    puts("listen successs\n");
    sin_size = sizeof(struct sockaddr_in);
    printf("sin_size is %d\n", sin_size);

    //接收,等待连接
    if((newsockfd = accept(sockfd, (struct sockaddr *)(&client_addr), &sin_size)) < 0){
        perror("accept error");
        exit(EXIT_FAILURE);
    }

    printf("accept a new connetction\n");
    printf("new socket id is %d\n", newsockfd);
    printf("Accept cilent ip is %s\n", inet_ntoa(client_addr.sin_addr));
    printf("Connect successful please input message\n");

    char mybuf[1024];
    char sendbuf[1024];

    while(1){
        int len = recv(newsockfd, mybuf, sizeof(mybuf), 0);
        
        //strcmp比较字符串
        if(strcmp(mybuf, "exit\n") == 0) break;

        //输出buf中数据
        fputs(mybuf, stdout);

        send(newsockfd, mybuf, len, 0);

        memset(sendbuf, 0, sizeof(sendbuf));
        memset(mybuf, 0, sizeof(mybuf));
    }

    close(newsockfd);
    close(sockfd);
    puts("exit success");
    exit(EXIT_SUCCESS);
    return 0;
}

2.客户端 

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<netdb.h>
#include<string.h>
#include<errno.h>

#define PORT 2345

int count = 1;

int main()
{
    int sockfd;
    char buffer[2014];
    struct sockaddr_in server_addr;
    struct hostent *host;
    int nbytes;

    //创建socket
    if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1){
        fprintf(stderr, "Socket Error is %s\n", strerror(errno));
        exit(EXIT_FAILURE);
    }

    //清空表示地址的结构体变量
    bzero(&server_addr, sizeof(server_addr));

    //设置addr的成员变量信息
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(PORT);

    //设置ip为本机ip
    server_addr.sin_addr.s_addr = htonl(INADDR_ANY);

    //客户端发出请求
    if(connect(sockfd, (struct sockaddr *)(&server_addr), sizeof(struct sockaddr)) == -1){
        fprintf(stderr, "Connect failed\n");
        exit(EXIT_FAILURE);
    }

    char sendbuf[1024];
    char recvbuf[2014];

    while(1){

        // fgets(sendbuf, sizeof(sendbuf), stdin);
        // send(sockfd, sendbuf, strlen(sendbuf), 0);

        // if(strcmp(sendbuf, "exit\n") == 0) break;
        // recv(sockfd, recvbuf, sizeof(recvbuf), 0);
        // fputs(recvbuf, stdout);
        // memset(sendbuf, 0, sizeof(sendbuf));
        // memset(recvbuf, 0, sizeof(recvbuf));


        fgets(sendbuf, sizeof(sendbuf), stdin);
        send(sockfd, sendbuf, strlen(sendbuf), 0);
        //fputs(sendbuf, stdout);


        if(strcmp(sendbuf, "exit\n") == 0) break;
        recv(sockfd, recvbuf, sizeof(recvbuf), 0);
        fputs(recvbuf, stdout);
        memset(sendbuf, 0, sizeof(sendbuf));
        memset(recvbuf, 0, sizeof(recvbuf));

    }

    close(sockfd);
    exit(EXIT_SUCCESS);
    return 0;
}

参考博客:(4条消息) linux网络编程之用socket实现简单客户端和服务端的通信(基于TCP)_kunkliu的博客-CSDN博客

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您介绍一下 C 语言实现 Socket 套接字的服务器端客户端通信。 首先,服务器端实现: 1. 创建 Socket: ```c int server_socket = socket(AF_INET, SOCK_STREAM, 0); ``` 2. 绑定 Socket: ```c struct sockaddr_in server_address; memset(&server_address, 0, sizeof(server_address)); server_address.sin_family = AF_INET; server_address.sin_addr.s_addr = htonl(INADDR_ANY); server_address.sin_port = htons(8080); bind(server_socket, (struct sockaddr *)&server_address, sizeof(server_address)); ``` 3. 监听 Socket: ```c listen(server_socket, 20); ``` 4. 接收客户端连接: ```c struct sockaddr_in client_address; socklen_t client_address_len = sizeof(client_address); int client_socket = accept(server_socket, (struct sockaddr *)&client_address, &client_address_len); ``` 5. 接收和发送数据: ```c char buffer[1024]; recv(client_socket, buffer, 1024, 0); send(client_socket, buffer, strlen(buffer), 0); ``` 6. 关闭 Socket: ```c close(client_socket); close(server_socket); ``` 接下来是客户端实现: 1. 创建 Socket: ```c int client_socket = socket(AF_INET, SOCK_STREAM, 0); ``` 2. 连接服务器: ```c struct sockaddr_in server_address; memset(&server_address, 0, sizeof(server_address)); server_address.sin_family = AF_INET; server_address.sin_addr.s_addr = inet_addr("127.0.0.1"); server_address.sin_port = htons(8080); connect(client_socket, (struct sockaddr *)&server_address, sizeof(server_address)); ``` 3. 发送和接收数据: ```c char buffer[1024]; fgets(buffer, 1024, stdin); send(client_socket, buffer, strlen(buffer), 0); recv(client_socket, buffer, 1024, 0); ``` 4. 关闭 Socket: ```c close(client_socket); ``` 以上就是 C 语言实现 Socket 套接字的服务器端客户端通信的基本流程。需要注意的是,这里只是一个简单的示例,实际的应用中还需要考虑一些异常情况的处理,例如连接超时、数据传输失败等。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值