【问题标题】:how to check the data is arrived on TCP socket?如何检查数据是否到达 TCP 套接字?
【发布时间】:2014-02-15 17:35:24
【问题描述】:
SOCKET sock;
SOCKET fd;
uint8* pChunkData;
uint16 chunkLen;
uint16 port = 52428;


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;
    int iResult;

    u_long iMode = 0;
    int sockoptval = 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");

    setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char *)&sockoptval, 1);

    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, 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");
        //closesocket(sock);
        }
        //echo(fd);

        printf("\n Process incoming connection from (%s , %d)", inet_ntoa(client.sin_addr),ntohs(client.sin_port));
    }
}

void main() {
    HANDLE h1,h2,h3;
    int bytes_recieved;

    double Task2ms_Raster, Task10ms_Raster, Task100ms_Raster ;

    pChunkData = &recv_data;
    chunkLen = sizeof(pChunkData);

    CreateSocket();

    while(1) {
        bytes_recieved = recv(fd, recv_data, 100 , 0 );
        recv_data[bytes_recieved] = '\0';
    }                         
    XcpIp_RxCallback (chunkLen, *pChunkData, port);
}

以上是一个服务器端程序,它正在接受来自主服务器的连接。我想打电话 XcpIp_RxCallback (chunkLen, *pChunkData, port); API,每当我在套接字 fd 上收到数据时。谁能告诉我该怎么做?

【问题讨论】:

  • if (bytes_recieved&gt;0) XcpIp_RxCallback (...); 放入循环中怎么样?
  • 好吧,你在CreateSocket 中有另一个无限循环for(;;)。它应该如何工作?
  • 它一直在接受传入的连接。

标签: c sockets tcp ip port


【解决方案1】:

从 'while(1) {..recv()..} 循环中分叉或线程。

【讨论】:

    【解决方案2】:

    您的代码没有意义。

    您的 CreateSocket() 方法永远循环接受连接并忽略它们,因此在 main() 中调用它之后从套接字读取的代码是无法访问的。

    您应该为每个接受的为该会话执行 I/O 的套接字生成一个线程。

    如果您在任何系统调用中遇到错误,仅打印一个字符串,甚至没有实际错误,然后就好像错误没有发生一样继续进行,这不足以缓解。

    这段代码没有意义将监听套接字设置为非阻塞模型

    【讨论】:

      猜你喜欢
      • 2014-07-07
      • 1970-01-01
      • 2010-10-05
      • 2019-02-06
      • 1970-01-01
      • 2011-12-28
      • 2014-01-28
      • 2019-09-01
      • 2014-04-08
      相关资源
      最近更新 更多