免费注册 查看新帖 |

Chinaunix

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

socket编程中的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-06-05 16:48 |只看该作者 |倒序浏览
socket编程中用数据流模式,一次只能连接一个客户端吗

论坛徽章:
0
2 [报告]
发表于 2006-06-05 20:07 |只看该作者
不明白,这两者有关系吗?

论坛徽章:
0
3 [报告]
发表于 2006-06-06 12:01 |只看该作者
看你的模型吧,简单的就是在接受到一个连接后去fork一个子进程去处理,父进程关闭连接端口。

论坛徽章:
0
4 [报告]
发表于 2006-06-06 14:42 |只看该作者
不懂,关闭了,连接端口,其他客户端怎么连接

论坛徽章:
0
5 [报告]
发表于 2006-06-07 10:48 |只看该作者
在连接之前服务器有一个监听描述符lfd,在某个端口port监听。

连接一个客户端后产生一个新的连接描述符cfd1,通过port与客户端传递数据,关闭时关闭的是连接描述符。

监听lfd还在存在,等待下一个客户的连接。

论坛徽章:
0
6 [报告]
发表于 2006-06-07 11:08 |只看该作者
建议看一些关于unix网络编程的书,了解一下各函数是如何调用的,看看上面的例子程序,在自己的机器上跑跑看,就知道了。

论坛徽章:
0
7 [报告]
发表于 2006-06-07 11:16 |只看该作者
给你一个简单的示例程序
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/wait.h>
main()
{
        int sockfd,new_fd;
        struct sockaddr_in my_addr;
        struct sockaddr_in their_addr;
        int sin_size;
        //建立TCP套接口
        if((sockfd = socket(AF_INET,SOCK_STREAM,0))==-1) {
                perror("socket";
                exit(1);
        }
        //初始化结构体,并绑定4477端口,服务端将在4477端口上接收连接请求和数据
        my_addr.sin_family = AF_INET;
        my_addr.sin_port = htons(4477);
        my_addr.sin_addr.s_addr = INADDR_ANY;
        bzero(&(my_addr.sin_zero),;
        //绑定套接口
        if(bind(sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr))==-1)
        {
                perror("bind";
                exit(1);
        }
        //创建监听套接口
        if(listen(sockfd,10)==-1) {
                perror("listen";
                exit(1);
        }
        //等待连接
        while(1) {
                sin_size = sizeof(struct sockaddr_in);
                perror("server is run";
//如果建立连接,将产生一个全新的套接字
                if((new_fd = accept(sockfd,(struct sockaddr *)&their_addr,&sin_size))==-1)
                {
                        perror("accept";
                        exit(1);
//生成一个子进程来完成和客户端的会话,父进程继续监听
                if(!fork())
                 {

                        //读取客户端发来的信息
                        while(1)
                        {

                                int numbytes;
                                char buff[1024];
                                memset(buff,0,sizeof(buff));
                                while(1)
                                {
                                        if((numbytes = recv(new_fd,buff+strlen(buff),sizeof(buff),0))==-1)
                                        {
                                                perror("recv";
                                                exit(1);
                                        }
                                        printf("pid=%d,buf:%s\n",getpid(),buff);
                                       
                                        if((numbytes==0)
                                                        break;
                                }
                                printf("recv:%s\n",buff);
                                //将从客户端接收到的信息再发回客户端
                                char buff2[1024];
                                memcpy(buff2,buff,10);                                
                                if(send(new_fd,buff,strlen(buff),0)==-1)
                                perror("send";
                                
                        }
                       
                }
                close(new_fd);
        }
        close(sockfd);
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP