服务端

#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#define PORT 8888
#define BACKLOG 2 // 帧听端口长度
void process_conn_server(int s);
int main()
{
    int ss,sc; //ss 为服务器socket描述符,sc 为客户端socket的描述符号
    struct sockaddr_in server_addr ; //服务器地址结构
    struct sockaddr_in client_addr;
    int err;
    pid_t pid;
// 建立套接字
    ss = socket(AF_INET, SOCK_STREAM, 0);// 建立流式的套接字
    if (ss < 0)
    {
        printf("socker error\n");
        return -1;
    }
    //设置服务器的地址
    bzero(&server_addr, sizeof(server_addr)); // 清空结构体的数据
    server_addr.sin_family = AF_INET; // 协议簇
    server_addr.sin_addr.s_addr = htonl(INADDR_ANY);//配置任何一个为本地的地址
    server_addr.sin_port = htons(PORT);
    //绑定地址和套接字
    err = bind(ss, (struct sockaddr*)&server_addr, sizeof(server_addr));
    if (err < 0)
    {
        printf("listen error\n");
        return -1;
    }
    //设置帧听队列
    err =listen(ss, BACKLOG);
    if(err < 0)
    {
        printf("listen error\n");
        return -1;
    }
    for(;;)
    {
        socklen_t addrlen = sizeof(struct sockaddr);
        sc = accept(ss, (struct sockaddr*)&client_addr, &addrlen);
        //接受客户端的连接
        if(sc < 0)
        {
            continue;
        }
        //当有客户端连接了
        pid = fork();
        if(pid == 0)//子进程关闭服务器的帧听
        {
            close(ss);
            process_conn_server(sc);
        }
        else//父进程关闭子进程
        {
            close(sc);
        }
    }
}
void process_conn_server(int s)
{
    ssize_t size = 0;
    char buffer[1024];

    for(;;)
    {
        size = read(s, buffer, 1024);

        if(size == 0)
        {
            return;
        }

        //构建相应字符,为接受到客户端字节的数量
        sprintf(buffer, "%d bytes altogeter\n", size);
        write(s, buffer, strlen(buffer) + 1);
    }
}
    #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <arpa/inet.h>
#define PROT 8888
void process_conn_client(int s)
{
    ssize_t size = 0;
    char buffer[1024];

    for(;;)
    {
        size = read(0, buffer, 1024);
        if(size > 0)
        {
            write(s, buffer, size);
            size = read(s, buffer, 1024);
            write(1, buffer, size);
        }
    }
}
int main(int argc,int **argv)
{
    int s;
    struct sockaddr_in server_addr;

    s = socket(AF_INET, SOCK_STREAM, 0);
    if(s < 0)
    {
        printf("socket error");
        return -1;
    }
    //设置服务器的地址
    bzero(&server_addr, sizeof(server_addr));
    server_addr.sin_family = AF_INET;
    server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    server_addr.sin_port = htons(PROT);

    inet_pton(AF_INET, argv[1], &server_addr.sin_addr);
    connect(s, (struct sockaddr*)&server_addr, sizeof(struct sockaddr));
    process_conn_client(s);
    close(s);
    return 0;
}

感想

其实linux有很多的sock的程序的例子
mpc mpd
浏览器  服务器
一时间想不起来了
好像蓝牙也是......

signal 信号注册处理函数
//挂接信号
void sig_pipe(int sign)
{
    printf("Catch a SIGPIPE signal\n");
}

signal(SIGPIPE, sig_pipe);//这个 放在main 里面,我去看着这个像是  放在文件最底下的方式,发现一直没成功,哭... ...
posted on 2017-12-01 01:25  HDU李少帅  阅读(295)  评论(0编辑  收藏  举报