socket编程中的问题

发布于 2022-07-21 17:19:46 字数 28 浏览 7 评论 6

socket编程中用数据流模式,一次只能连接一个客户端吗

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

人间不值得 2022-07-24 07:32:12

给你一个简单的示例程序
#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:%sn",getpid(),buff);
                                       
                                        if((numbytes==0)
                                                        break;
                                }
                                printf("recv:%sn",buff);
                                //将从客户端接收到的信息再发回客户端
                                char buff2[1024];
                                memcpy(buff2,buff,10);                                
                                if(send(new_fd,buff,strlen(buff),0)==-1)
                                perror("send";
                                
                        }
                       
                }
                close(new_fd);
        }
        close(sockfd);
}

剩一世无双 2022-07-24 05:23:16

建议看一些关于unix网络编程的书,了解一下各函数是如何调用的,看看上面的例子程序,在自己的机器上跑跑看,就知道了。

一身仙ぐ女味 2022-07-24 01:04:21

在连接之前服务器有一个监听描述符lfd,在某个端口port监听。

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

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

哀由 2022-07-24 00:11:17

不懂,关闭了,连接端口,其他客户端怎么连接

硪扪都還晓 2022-07-23 13:03:01

看你的模型吧,简单的就是在接受到一个连接后去fork一个子进程去处理,父进程关闭连接端口。

诗酒趁年少 2022-07-23 09:55:28

不明白,这两者有关系吗?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文