为什么我的TCP服务器代码仅在第一个数据包或仅在第一个连接上发送SYN / ACK?

时间:2014-01-23 06:30:11

标签: multithreading sockets tcp ip port

SOCKET sock;
SOCKET fd;
uint16 port = 18001;

void CreateSocket()
{
   struct sockaddr_in server, client;  // creating a socket address structure: structure contains ip address and port number
  WORD wVersionRequested;
WSADATA wsaData;
int len;

    printf("Initializing Winsock\n");


    wVersionRequested = MAKEWORD (2, 2);
    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");




    // 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(18001);


    //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,3) == -1){
        printf("Listen failed with error code: %d", WSAGetLastError());
    }

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

    for(;;){
        len = sizeof(client);
        fd = accept(sock, (struct sockaddr*) &client, &len);

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

}

服务器代码通过ip地址和端口号接受来自客户端的连接。它仅在第一次连接期间向客户端发送SYN / ACK,并且第二次发送如下:RST / ACK(它在第二次重置时)。

有谁能告诉我上面代码中的错误是什么?

1 个答案:

答案 0 :(得分:-1)

查看Accept multiple subsequent connections to socket

以下是一句话:“要为多个客户端提供服务,您需要避免阻止I / O - 也就是说,在数据进入之前,您不能只是从套接字读取并阻塞。”