套接字 学习笔记四  书本例子

来源:互联网 发布:海康威视网络设置教程 编辑:程序博客网 时间:2024/04/30 07:12

1.客户端程序

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

int main()
{
    int sockfd;
    int len;
    struct sockaddr_in address;
    int result;
    char ch[255] = "hello,I am client. \n";
    char buffer[255];
    
    //创建客户套接字
    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    
    //命名
    address.sin_family = AF_INET;
    address.sin_addr.s_addr = inet_addr("127.0.0.1");//服务端地址
    address.sin_port = htons(9734);//服务端端口
    len  = sizeof(address);
    
    //将客户套接字连接到服务器套接字
    result = connect(sockfd, (struct sockaddr *)&address, len);
    if(result == -1)
    {
        perror("client error! \n");
        exit(1);
    }
    
    //通过套接字进行请读写操作
    write(sockfd, ch, 255);
    read(sockfd, buffer, 255);
    printf("char from server: %s \n", buffer);
    close(sockfd);

    return 0;
}


2.服务端程序

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/time.h>
#include <sys/ioctl.h>
#include <unistd.h>

int main()
{
    //声明有用的变量
    int server_sockfd,client_sockfd;
    int server_len,client_len;
    struct sockaddr_in server_address,client_address;
    int result;
    struct timeval timeout;
    int MAX_FD = 0;
    
    fd_set readfds,testfds;
    timeout.tv_sec = 2;
    timeout.tv_usec = 500000;
    
    //为服务器创建一个套接字并命名
    server_sockfd = socket(AF_INET, SOCK_STREAM, 0);
    server_address.sin_family = AF_INET;
    server_address.sin_addr.s_addr = htonl(INADDR_ANY);
    server_address.sin_port = htons(9734);
    server_len = sizeof(server_address);
    
    //sockaddr可以看做是sockaddr_in或sockaddr_un
    bind(server_sockfd, (struct sockaddr *)&server_address, server_len);
    
    //创建队列
    listen(server_sockfd, 5);
    
    FD_ZERO(&readfds);
    FD_SET(server_sockfd, &readfds);
    printf("server_sockfd: %d \n", server_sockfd);
    MAX_FD = server_sockfd;
    
    //等待、处理客户请求
    while(1)
    {
        char ch[255];
        char buffer[255] = "I'm server,your message gotten. \n";
        int fd;
        int nread;
        
        testfds = readfds;
        
        printf("server waiting. \n");
        result = select(FD_SETSIZE, &testfds, (fd_set *)0, (fd_set *)0, (struct timeval *)0);
        //result = select(FD_SETSIZE, &testfds, (fd_set *)0, (fd_set *)0, (struct timeval *)&timeout);
        //printf("test .1");
        
        if(result < 1)
        {
            perror("server error occured! \n");
            exit(1);
        }
        for(fd = 0; fd < FD_SETSIZE; fd++)
        {
            if(FD_ISSET(fd, &testfds))
            {
                //如果活动发生在服务器套接字上,则添加请求连接的客户套接字描述符到描述符集合中
                if(fd == server_sockfd)
                {
                    client_len = sizeof(client_address);
                    client_sockfd = accept(server_sockfd, (struct sockaddr *)&client_address, &client_len);
                    FD_SET(client_sockfd, &readfds);    
                    printf("adding client on fd %d \n", client_sockfd);
                }
                
                //如果活动发生在客户套接字上(客户套接字是之前while循环中if(FD_ISSET(fd, &testfds)选择分支中添加的),则进行相应处理
                else
                {
                    ioctl(fd, FIONREAD, &nread);
                    
                    //套接字缓冲区没有数据则关闭套接字,并将它从集合中移除
                    if(nread == 0)
                    {
                        close(fd);
                        FD_CLR(fd, &readfds);
                        printf("client on fd %d closed. \n", fd);
                    }
                    //有数据则,则进行读操作
                    else
                    {
                        read(fd, ch ,255);
                        sleep(5);        //毫秒
                        printf("message from client: %s \n", ch);
                        printf("processing clinet on fd %d. \n",fd);
                        write(fd, buffer, 255);
                    }
                }
            }
        }
    }

    return 0;
}


原创粉丝点击