【问题标题】:how to come out of the for loop in socket program?如何摆脱套接字程序中的for循环?
【发布时间】:2014-02-19 11:08:36
【问题描述】:
int CreateSocket()
{
struct sockaddr_in server, client;  // creating a socket address structure: structure contains ip address and port number
WORD wVersionRequested;
WSADATA wsaData;
int len;
int iResult;

//int count = 0;

//u_long iMode = 1;


    printf("Initializing Winsock\n");


    wVersionRequested = MAKEWORD (1, 1);
    iResult =  WSAStartup (wVersionRequested, &wsaData);      
    if (iResult != NO_ERROR)
   printf("Error at WSAStartup()\n"); 


    // create socket
    sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (sock < 0)    {
        printf("Could not Create Socket\n");
        //return 0;
    }

    printf("Socket Created\n");  

//      iResult = ioctlsocket(sock, FIONBIO, &iMode);
//if (iResult != NO_ERROR)
//  printf("ioctlsocket failed with error: %ld\n", iResult);


    // create socket address of the server
    memset( &server, 0, sizeof(server));


    // IPv4 - connection
    server.sin_family = AF_INET;
    // accept connections from any ip adress
    server.sin_addr.s_addr = htonl(INADDR_ANY);
    // set port
    server.sin_port = htons(52428);


    //Binding between the socket and ip address
    if(bind (sock, (struct sockaddr *)&server, sizeof(server)) < 0)
    {
        printf("Bind failed with error code: %d", WSAGetLastError());
    }


    //Listen to incoming connections
    if(listen(sock, 10) == -1){
        printf("Listen failed with error code: %d", WSAGetLastError());
    }

    printf("Server has been successfully set up - Waiting for incoming connections");

    for(;;)   // accepting the connection continuously
    {
        len = sizeof(client);
        fd = accept(sock, (struct sockaddr*) &client, &len);

        if(fd < 0)
        {
            printf("Accept failed\n");
        }
        else
        {
        printf("\n Process incoming connection from (%s , %d)", inet_ntoa(client.sin_addr),ntohs(client.sin_port));
        break;
        }

    }

}
void main()
{
    int data;

double Task2ms_Raster, Task10ms_Raster, Task100ms_Raster ;


CreateSocket();

 Xcp_Initialize();

    while(1)
        {
            data = recv(fd, recv_data, 99, 0);
            if (data == SOCKET_ERROR) {
     printf("recv failed with error %d\n", WSAGetLastError());
     } else
            {
             pChunkData = &recv_data;
            chunkLen = sizeof(pChunkData);
            XcpIp_RxCallback ((uint16) chunkLen, (char*) pChunkData, (uint16) port);
            }


        }

}

上面是一个服务器套接字程序:我创建了一个套接字,用于接受带有 ip 地址和端口号的连接。我的程序继续接受连接,只要它接受连接,它就应该退出 for 循环。锄头使上述程序在接受连接时退出循环??
谁能帮帮我。

我修改了上面的代码并添加了主程序。接受来自客户端的连接后。然后我得到输出,因为 recv 失败并出现错误。控制将进入 while 循环并显示为 :recv failed with error 在主函数中。为什么会这样??

【问题讨论】:

  • 如果您只想处理 1 个连接,只需将 break 放入 else 部分即可。

标签: c windows sockets ip


【解决方案1】:

使用break 语句。它可用于退出任何类型的循环。

或者,当然,使accept() 成为循环的条件:

while( (fd = accept(...)) >= 0)
{
}

在阅读代码时可以立即清楚地表明“啊,这是一个循环,只要我们能够接受传入的连接,它就会一直运行”。

当你将退出条件“埋”在里面并使用break时,它变得更难理解了。

【讨论】:

    【解决方案2】:

    你应该看看----&gt;

    while(1)
    
    {
    
     //conditon for break
    if(fd < 0)
        {
            printf("Accept failed\n");
            break;
        }
    
    }
    

    【讨论】:

    • 非常感谢您的回复。我修改了上面的代码并添加了主程序。接受来自客户端的连接后。然后我得到输出,因为 recv 失败并出现错误。控制将进入 while 循环并显示为 :recv failed with error 在主函数中。为什么会这样??
    • 我编辑了上面的代码并添加了接收功能。客户端将前三次发送连接到服务器以接受连接。我不必担心客户。客户端是一个 INCA 工具,它将向服务器发送连接请求。上面的代码只接受一次连接。我正在接受 for 循环中的连接。
    【解决方案3】:

    干得好,伙计。只需将break 放在其他部分即可。

    for(;;)   // accepting the connection continuously
        {
            len  = sizeof(client);
        fd = accept(sock, (struct sockaddr*) &client, &len);
    
        if(fd < 0)
        {
            printf("Accept failed\n");
        }
        else
        {
        printf("\n Process incoming connection from (%s , %d)", inet_ntoa(client.sin_addr),ntohs(client.sin_port));
        break;
    
        }
    
    }
    

    【讨论】:

    • 为什么你会在失败中继续并在成功时中断?
    猜你喜欢
    • 2020-08-04
    • 2014-02-12
    • 2020-02-21
    • 2018-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多