2014-01-27 2 views
0
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; 

    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"); 


    // 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"); 

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

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



} 


int main() 
{ 

    HANDLE h1,h2,h3; 



double Task2ms_Raster, Task10ms_Raster, Task100ms_Raster ; 


CreateSocket(); 

Xcp_Initialize(); 

    while(1) 
     { 
     if(fd == -1) 
     { 
      printf("Socket error\n "); 
     } 
     else 

     { 
      recv(fd, recv_data, 99, 0); 
      // pChunkData = &recv_data; 
      //chunkLen = sizeof(pChunkData); 
      //XcpIp_RxCallback ((uint16) chunkLen, (char*) pChunkData, (uint16) port); 

     } 
     } 


     } 

выше, это серверная программа: Я создаю сокет с ip-адресом и номером порта. Я принимаю соединение от клиента и получаю данные от клиента. Мне нужно вызвать API: XcpIp_RxCallback ((uint16) chunkLen, (char *) pChunkData, (uint16) порт); когда он получает данные о порте. Может ли кто-нибудь сказать мне, где назвать API в вышеуказанной программе?вызов API в программе сокетов?

ответ

0

Используйте recvfrom функцию http://msdn.microsoft.com/en-us/library/windows/desktop/ms740120%28v=vs.85%29.aspx, а затем вызвать XcpIp_RxCallback

Код выглядит как

iResult = recvfrom(RecvSocket,RecvBuf, 
    BufLen, 0, (SOCKADDR *) & SenderAddr, &SenderAddrSize); 

if (iResult == SOCKET_ERROR) { 
    wprintf(L"recvfrom failed with error %d\n", WSAGetLastError()); 
} else { 
    XcpIp_RxCallback ((uint16) iResult, (char*) RecvBuf, (uint16)htons(SenderAddr.sin_port)); 
} 
+0

Зачем использовать recvfrom()? Адрес отправителя для сокета не изменяется, и он предоставляется accept(). – EJP

+0

Я буду использовать recv api !!! – user3189297

Смежные вопросы