免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1667 | 回复: 7
打印 上一主题 下一主题

socket question!!! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-04-03 16:53 |只看该作者 |倒序浏览
1.一个socket Server 是不是只能接受一个cilent 的请求呢?如果要接受多个请求,是不是一定要用多线程?为什么还要用listen()设置消息队列?
2.我的socket server根本没有写 close()函数,为什么再接受client 的请求之后就自己结束了呢?不理解,client端也一样,我根本没有写close()!求解

论坛徽章:
0
2 [报告]
发表于 2012-04-03 16:54 |只看该作者
顶一个

论坛徽章:
0
3 [报告]
发表于 2012-04-04 21:54 |只看该作者
回复 1# hanzhiwei111

1.一个socket Server 是不是只能接受一个cilent 的请求呢?如果要接受多个请求,是不是一定要用多线程?为什么还要用listen()设置消息队列?
2.我的socket server根本没有写 close()函数,为什么再接受client 的请求之后就自己结束了呢?不理解,client端也一样,我根本没有写close()!求解
=======================================
我按照你是使用TCP来理解了啊。

1. 不一定非要用多线程。你可以把accept后的返回的socket,加入到fd_set中,使用select来检测哪个socket有数据可读可写等。这样一个线程就可以满足需求。
2. 为什么再接受client 的请求之后就自己结束了呢?——你所谓的结束,是什么意思?进程退出了?
    如果进程退出,一般情况下,kernel会关闭所有的文件描述符。

论坛徽章:
0
4 [报告]
发表于 2012-04-11 12:24 |只看该作者
回复 3# GFree_
多谢回复啊!
我不太明白,如果server端,没有使用close(),那么在一次client建立链接之后会是什么反映?server仍然在监听吗?
以下是代码,帮忙看看有什么问题吗???

正常的现象是什么样子的呢?运行的结果和我想的不一样。。。

server.c:

int main(int argc , char* argv[]){

        int server_sockfd,client_sockfd;
        int server_len,client_len;
        struct sockaddr_in server_address;
        struct sockaddr_in client_address;
        int i,byte;
        char char_recv,char_send;

        //socket(int _domain,int _type,int _protocol)
        server_sockfd=socket(AF_INET,SOCK_STREAM,0);

        //bind(int _fd,const struct sockaddr *addr,socklen_t addrlen)
        server_address.sin_family=AF_INET;
        server_address.sin_addr.s_addr=inet_addr("127.0.0.1");
        server_address.sin_port=9734;
        server_len=sizeof(server_address);
        bind(server_sockfd,(struct sockaddr *)&server_address,server_len);

        //liste(int _fd,int _n)
        listen(server_sockfd,5);
printf("aaaaaaaaaaaaaaaaaaaaaaaa\n");
        printf("the server has been waiting......\t\n");      

        //accept(int _fd,struct sockaddr *addr, socklen_t *addrlen)
        client_len=sizeof(client_address);
        client_sockfd=accept(server_sockfd,(struct sockaddr *)&client_address,(socklen_t *)client_len);
        //read() or write()
        return 0;
}

client.c:

int main(int argc,char* argv[]){
        int sockfd_client;
        struct sockaddr_in client_address;
        int client_len;

        int result;
        int i,byte;
        char char_recv,char_send;

        //int socket(int _domain,int _type,int _protocal)
        if((sockfd_client=socket(AF_INET,SOCK_STREAM,0))==-1){
                printf("Sorry! fail to establish the socket client!\n");
                exit(0);
        }
        //int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
        client_len=sizeof(client_address);
        client_address.sin_family=AF_INET;
        client_address.sin_addr.s_addr=inet_addr("127.0.0.1");
        client_address.sin_port=9734;
        if((result=connect(sockfd_client,(struct sockaddr *)&client_address,client_len))==-1){
                printf("Sorry! fail to connect to the server!\n");
                exit(0);
        }
        //read()/recv()
        //write()/send()
        //close()
        return 0;

论坛徽章:
0
5 [报告]
发表于 2012-04-11 17:19 |只看该作者
socket有很多种,最常见的TCP和UDP在这方面就不一样,你想说的是哪一种?

有连接的就像是一个真正的插座,同一时刻最多只能有一个插头。
无连接的就像是一个漏斗,随便谁都能望里面灌水。

论坛徽章:
0
6 [报告]
发表于 2012-04-11 21:43 |只看该作者
回复 4# hanzhiwei111

从你的代码看,server只会接受一个client的连接,然后就做完工作了,return 0
同样, client也是一样,连接建立后就做完工作,return 0
进程结束时,自动close这些fd
   

论坛徽章:
0
7 [报告]
发表于 2012-04-12 04:54 |只看该作者
1.一个socket Server可以接受多个client请求,一般称该socket为监听socket。在accept后会有一个新的socket,一般用作通信socket。以我的经验,多线程是比较好的方式,没试过其他的。listen用于设置可连接的最大请求数。
2.从你的代码看,你的socket server只能接受一个用户请求,在相应操作完成后就执行到return了,server肯定就退出了。在server端都退出后,如果不做一些处理客户端也会退出。如果不想让server在完成一个用户服务后退出,你可以在server端加一句:
while(1){ //加上一个循环
    accept();
}

以上仅参考,也许有不对的地方

论坛徽章:
0
8 [报告]
发表于 2012-04-25 11:20 |只看该作者
回复 7# viczjw123

不好意思,托了这么长时间,我已经明白了,accept  只能处理一次请求,多谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP