Linux网络编程示例2

来源:互联网 发布:c51单片机中断程序 编辑:程序博客网 时间:2024/05/21 10:11

服务端程序


#include <stdio.h>

#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <string.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <netinet/in.h>
 #include <pthread.h>

void *read_func(void *arg)
{
    int fd = *(int *)arg;
    int ret = -1;
    char buf[10] = {'\0'};
    //读取客户端的信息
    ret = read(fd, buf, 6);
    if(ret < 0){
        perror("read");
        pthread_exit(NULL);
    }

    while(1){
        sleep(1);
        if(strncmp(buf, "hello", 5) == 0){
            write(fd, "world", 6);
        }
        else{
            printf("Is not [hello]\n");
            write(fd, "nothe", 6);
        }
    }

}

int main(void)
{
    int fd = -1;
    int new_fd = -1;
    int ret = 0;
    char buf[6];
    pthread_t th_id;
    struct sockaddr_in server_add;
    //建立Socket连接
    fd = socket(AF_INET, SOCK_STREAM, 0);
    if(fd <  0){
        perror("socket");
        exit(1);
    }

    memset(&server_add, 0, sizeof(server_add));
    //设置sockaddr_in结构体中的相关参数
    server_add.sin_family = AF_INET;
    server_add.sin_port = htons(8888);
    server_add.sin_addr.s_addr = inet_addr("192.168.7.200");
    //绑定
    ret = bind(fd, (struct sockaddr *)&server_add, sizeof(struct sockaddr));
    if(ret < 0){
        perror("bind  ");
        exit(1);
    }
    //调用listen函数,创建示处理请求的队列
    listen(fd, 5);

    while(1){
        //调用accept函数,等待客户端的连接
        new_fd = accept(fd, NULL, NULL);
        if(new_fd < 0){
            perror("accept  ");
            exit(1);
        }
        //创建一个线程,用于读取客户端信息
        pthread_create(&th_id, NULL, read_func, &new_fd);
    }

    return 0;
}


客户端程序

#include <stdio.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <string.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <netinet/in.h>

void *recv_func(void *arg)
{
    char buf[10] = {'\0'};
    int fd = *(int *)arg;
    int ret = -1;

    while(1){
        ret = read(fd, buf, 6);
        if(0 == ret){
            printf("server is exit!\n");
            exit(1);
        }
        if(ret < 0){
            perror("read");
            pthread_exit(NULL);
        }
        printf("read:%s\n", buf);    
    }

}

int main(void)
{
    int fd = -1;
    int new_fd = -1;
    int ret = 0;
    char buf[6];
    pthread_t th_id;
    struct sockaddr_in server_add;
    //建立Socket连接
    fd = socket(AF_INET, SOCK_STREAM, 0);
    if(fd <  0){
        perror("socket");
        exit(1);
    }
    //设置sockaddr_in结构体中的相关参数
    server_add.sin_family = AF_INET;
    server_add.sin_port = htons(8888);
    server_add.sin_addr.s_addr = inet_addr("192.168.7.200");

#if 0    
    ret = bind(fd, (struct sockaddr *)&server_add, sizeof(struct sockaddr));
    if(ret < 0){
        perror("bind  ");
        exit(1);
    }
#endif


    ret = connect(fd, (struct sockaddr *)&server_add, sizeof(struct sockaddr));
    if(ret < 0){
        perror("connect ");
        exit(1);
    }
    //创建一个线程,用于接收服务端信息
    pthread_create(&th_id, NULL, recv_func, &fd);

    while(1){
        memset(buf, 0, 6);
        fgets(buf, 6, stdin);
        write(fd, buf, 6);
        printf("read:%s\n", buf);
    }

    close(fd);

    return 0;
}


编译:

gcc -o client_process client_process.c -lpthread


gcc -o server_process server_process.c -lpthread

先运行服务端

./server_process

再运行客户端

./client_process


原创粉丝点击