LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 903|回复: 3

这两种socket的写法有什么区别吗?

[复制链接]
发表于 2009-10-7 09:50:54 | 显示全部楼层 |阅读模式
一个linux上的支持并发的服务器socket程序,当接收到新的请求之后,就发送字符数组到客户端。两个代码,一个是用了进程,一个是不用进程的,我想请问大家这两个有什么区别吗?万分感谢!!!
/* 有子进程的 */
int main()
{
        int i=0,ii,m,n,fd;
        unsigned char rreq[10];

        pid_t pid;
        int sock_fd, client_fd, sin_size;
        struct sockaddr_in my_addr;
        struct sockaddr_in remote_addr;
        if ((sock_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
        {
                perror("socket is created error!");
                exit(1);
        }
        my_addr.sin_family = AF_INET;
        my_addr.sin_port=htons(SERVER_PORT);
        my_addr.sin_addr.s_addr = INADDR_ANY;
        bzero(&(my_addr.sin_zero), 8);
        if (bind(sock_fd, (struct sockaddr*)&my_addr, sizeof(struct sockaddr)) == -1)
        {
                perror("Bind is error");
                exit(1);
        }
        if (listen(sock_fd, BACKLOG) == -1)
        {
                perror("listen is error");
                exit(1);
        }
        while(1)
        {
                read(fd,rreq,sizeof(rreq)); // 此段为从spi中读入到rreq字符数组中。

                sin_size = sizeof(struct sockaddr_in);
                if ((client_fd = accept(sock_fd, (struct sockaddr*)&remote_addr, &sin_size)) == -1)
                {
                        perror("Accept error");
                        continue;
                }
                printf("received a connection from %s\n", inet_ntoa(remote_addr.sin_addr));
                pid = fork();
                if (pid < 0)
                {
                        perror("Create Process error");
                        exit(1);
                }
                else if (pid == 0)
                {
                        if(send(client_fd, rreq, sizeof(rreq), 0) == -1)
                        {
                                perror("send is error");
                                exit(1);
                        }
                        close(client_fd);
                        close(sock_fd);
                        exit(0);
                }
                else
                {
                        wait(NULL);
                        close(client_fd);
                }
        }
        close(sock_fd);
        return(0);
}

/* 不带进程的 */
int main()
{
        int i=0,ii,m,n,fd;
        unsigned char rreq[10];

        pid_t pid;
        int sock_fd, client_fd, sin_size;
        struct sockaddr_in my_addr;
        struct sockaddr_in remote_addr;
        if ((sock_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
        {
                perror("socket is created error!");
                exit(1);
        }
        my_addr.sin_family = AF_INET;
        my_addr.sin_port=htons(SERVER_PORT);
        my_addr.sin_addr.s_addr = INADDR_ANY;
        bzero(&(my_addr.sin_zero), 8);
        if (bind(sock_fd, (struct sockaddr*)&my_addr, sizeof(struct sockaddr)) == -1)
        {
                perror("Bind is error");
                exit(1);
        }
        if (listen(sock_fd, BACKLOG) == -1)
        {
                perror("listen is error");
                exit(1);
        }
        while(1)
        {
                read(fd,rreq,sizeof(rreq)); // 此段为从spi中读入到rreq字符数组中。

                sin_size = sizeof(struct sockaddr_in);
                if ((client_fd = accept(sock_fd, (struct sockaddr*)&remote_addr, &sin_size)) == -1)
                {
                        perror("Accept error");
                        continue;
                }
                printf("received a connection from %s\n", inet_ntoa(remote_addr.sin_addr));
                /* 有区别的地方, 不创建子进程  */
                if(send(client_fd, rreq, sizeof(rreq), 0) == -1)
                {
                        perror("send is error");
                                exit(1);
                }
                close(client_fd);
        }
        close(sock_fd);
        return(0);
}
发表于 2009-10-7 13:20:11 | 显示全部楼层
不带进程的不能并发。同时只能accept 一个客户端请求,并向它发送数据。
带进程的,可以同时有N个客户端连进来, 并向他们发送数据。

还有在有些系统上, 创建的子进程中首先应该close(sock_fd)关闭监听,然后再干别的事。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-10-7 13:58:41 | 显示全部楼层
Post by 雨落鹰飞;2033863
不带进程的不能并发。同时只能accept 一个客户端请求,并向它发送数据。
带进程的,可以同时有N个客户端连进来, 并向他们发送数据。

还有在有些系统上, 创建的子进程中首先应该close(sock_fd)关闭监听,然后再干别的事。


好的,谢谢你,我试试!
我服务器端用的是linux,客户端用的C#,为什么一段时间之后,尽管查看端口状态netstat,连接是建立的,established,但是执行到send的时候就停住了,不发数据,但是也不报错。。。是不是因为close(socket)没有放在最前面的原因??我服务器端用的是没有进程的那一种方法。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-10-7 13:59:40 | 显示全部楼层
好的,谢谢你,我试试!
我服务器端用的是linux,客户端用的C#,为什么一段时间之后,尽管查看端口状态netstat,连接是建立的,established,但是执行到 send的时候就停住了,不发数据,但是也不报错。。。是不是因为close(socket)没有放在最前面的原因??我服务器端用的是没有进程的那一种方法。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表