美文网首页
Socket 服务器与客户端多线程

Socket 服务器与客户端多线程

作者: wjundong | 来源:发表于2019-12-23 09:45 被阅读0次

服务器

#include <stdio.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h> 
#include <pthread.h>


void *call_back(void *new_stocket)
{
    printf("客户端连接\n");

    char buffer1[100], buffer2[200];
    int stocket_fd = *((int*)new_stocket), len;

    while((len = read(stocket_fd, buffer1, 100)) > 0) {
        buffer1[len] = '\0';
        sprintf(buffer2, "[%ld]: 好的 `%s` 我知道了:\n", pthread_self(), buffer1);
        send(stocket_fd, buffer2, strlen(buffer2), 0);
    }
    printf("客户端退出\n");
}


int main()
{
    int server_fd = socket(AF_INET, SOCK_STREAM, 0);
    if(server_fd < 0) {
        printf("error: create socket failed!\n");
        return -1;
    }

    struct sockaddr_in addr;
    addr.sin_family = AF_INET;
    addr.sin_addr.s_addr = INADDR_ANY;
    addr.sin_port = htons(8080);

    int opt = 1;
    // 强制将套接字连接到 8080 端口
    if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) { 
        perror("setsockopt"); 
        exit(EXIT_FAILURE); 
    } 

    // 绑定并监听
    bind(server_fd, (struct sockaddr *)&addr, sizeof(addr));
    listen(server_fd, 4);
    int addrlen = sizeof(addr);


    while(1) {
        // 挂起捕获
        int new_stocket = accept(server_fd, (struct sockaddr *)&addr, (socklen_t*)&addrlen);
        if(new_stocket < 0) {
            printf("error: create socket failed!\n");
            return -1;
        }
        pthread_t pthread;
        pthread_create(&pthread, NULL, call_back, &new_stocket);
    }
}

客户端

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


int main()
{
    // 创建套接字
    int sock = socket(AF_INET, SOCK_STREAM, 0);
    if(sock < 0) {
        printf("error: create socket failed!\n");
        return -1;
    }

    // 创建网络地址变量
    struct sockaddr_in addr;
    addr.sin_family = AF_INET;
    addr.sin_port = htons(8080);
    // 将实际字符串地址转换成二进制地址
    inet_pton(AF_INET, "127.0.0.1", &addr.sin_addr);

    // 连接到指定地址和端口的网络
    if(connect(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
        printf("error: connect failed!\n");
        return -1;
    }

    // 成功建立连接,开始通信
    char buffer[100] = {0};
    printf("连接成功,开始通信(输入-1退出)\n");
    int len;
    while(1) {
        scanf("%s", buffer);
        if(!strcmp(buffer, "-1")) {
            break;
        }
        write(sock, buffer, strlen(buffer));
        len = read(sock, buffer, 100);
        buffer[len] = '\0';
        printf("%s\n", buffer);
    }
}

相关文章

网友评论

      本文标题:Socket 服务器与客户端多线程

      本文链接:https://www.haomeiwen.com/subject/eixznctx.html