【问题标题】:socket programming connect() fails the second time I run the loop套接字编程 connect() 在我第二次运行循环时失败
【发布时间】:2012-11-26 02:02:34
【问题描述】:

我正在尝试在 for 循环中运行服务器端和客户端。我第一次运行它时,它运行良好,但第二次连接失败或卡在接受()。这是我的代码:

客户端代码:

for(i=0;i<2;i++)
{
        if( connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0)
    {
        printf("\nError : Connect Failed\n");
        return 1;
    }   

    //***************Writing_I***************
    memset(recvBuff, '0',sizeof(recvBuff));
    ticks = time(NULL);
    snprintf(recvBuff, sizeof(recvBuff), "%.24s\r\n", ctime(&ticks));
    if((n = send(sockfd, recvBuff, strlen(recvBuff), 0))<0)
    {
        printf("Error : send operation failed\n");
    }

    //***************Reading_I***************
    memset(recvBuff, '0', sizeof(recvBuff)); 
    n= recv(sockfd, recvBuff, sizeof(recvBuff)-1, 0);
    {
        printf("bytes read: %d\n", n);
        recvBuff[n] = '\0';
        printf("Data: %s\n",recvBuff);
    } 
    if(n < 0)
    {
        printf("\n Read error \n");
    } 
}
close(sockfd);  

服务器代码:

if((connfd = accept(listenfd, (struct sockaddr*)NULL, NULL))>=0)
{ 
    for(i=0;i<2;i++)    
    {   
        fd= open("/home/t/Desktop/CS II/A4/test.txt", O_RDONLY);
        //***************Reading***************
        memset(sendBuff, '0', sizeof(sendBuff)); 
        count = recv(connfd, sendBuff, sizeof(sendBuff)-1, 0);
        {
            printf("bytes read: %d\n", count);
            sendBuff[count] = '\0';
            printf("Data: %s\n",sendBuff);
        }
        if(count < 0)
        {
            printf("Read error \n");
        }

        //***************Writing***************
        ticks = time(NULL);
        memset(sendBuff, '0', sizeof(sendBuff)); 
        printf("Reading from file\n");
        if((noOfBytesRd= read(fd, sendBuff, sizeof(sendBuff)-1))<0)
            printf("\n Error : read operation failed\n");
        sendBuff[noOfBytesRd]='\0';
        if((count = send(connfd, sendBuff, strlen(sendBuff), 0))<0)
            printf("\n Error : wtite operation failed\n");
    }
    close(connfd);  
 }

【问题讨论】:

  • sn-ps 的代码一团糟。请正确缩进。

标签: c sockets connect


【解决方案1】:

一个套接字在其生命周期中只能被connect'ed 一次。您应该为要建立的每个连接创建一个单独的套接字,并在完成连接后关闭它。

【讨论】:

  • 非常感谢。我将 connect() 移到了 for 循环之外,它起作用了。但是,如果我在客户端有多个线程,我应该为它们分配不同的 socketId 并并行运行它们还是使用相同的 socketId 同步运行它们?哪种是首选方法?再次感谢!
  • 我不确定我是否理解您的问题。你能描述一下你想要达到的目标吗?
  • 我正在尝试从客户端并行发送请求,因为我需要生成多个线程并且每个线程都会向服务器发送请求。在服务器端,也会有许多线程处理从客户端收到的请求。那么,在客户端,我应该为每个线程创建一个套接字还是只为所有线程使用相同的套接字并进行某种同步?我想知道这通常是怎么做的。
  • 为每个传出连接运行一个线程是一种可能的方法,但您需要注意对共享资源的访问同步以避免竞争条件。当然,每个连接都需要自己的套接字和唯一的 fd。另一种策略是在单个线程中处理所有传出连接(仍然每个都有其单独的套接字),使用select() 序列化您的逻辑。
猜你喜欢
  • 2011-09-02
  • 2021-01-04
  • 2020-08-04
  • 1970-01-01
  • 1970-01-01
  • 2016-02-29
  • 2020-03-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多