2014-02-24 3 views
0
int acceptSocket; 
char buf[100]; 
long sentbytes; 
socklen_t len; 
int port = 18227; 

int CreateSocket() 
{ 
    long rc; 
    struct sockaddr_in addr, client; 

     // Socket creation for UDP 
     acceptSocket=socket(AF_INET,SOCK_DGRAM,0); 

     if(acceptSocket==-1) 
     { 
     printf("Failure: socket creation is failed, failure code\n"); 
     return 1; 
     } 
     else 
     { 
     printf("Socket started!\n"); 
     } 

    memset(&addr, 0, sizeof(struct sockaddr_in)); 
    addr.sin_family=AF_INET; 
    addr.sin_port=htons(port); 
    addr.sin_addr.s_addr=htonl(INADDR_ANY); 
    rc=bind(acceptSocket,(struct sockaddr*)&addr,sizeof(addr)); 

    if(rc== -1) 
    { 
     printf("Failure: listen, failure code:\n"); 
     return 1; 
    } 
    else 
    { 
     printf("Socket an port %d \n",port); 
    } 

    while(rc!=-1) 
     { 
     len =sizeof(client); 
     rc=recvfrom(acceptSocket,buf, sizeof(buf), 0, (struct sockaddr*) &client, &len); 
     if(rc==0) 
     { 
      printf("Server has no connection..\n"); 
      break; 
     } 
     if(rc==-1) 
     { 
      printf("something went wrong with data %s", strerror(errno)); 
      break; 
     } 

     XcpIp_RxCallback((uint16) rc, (uint8*) buf, (uint16) port); 

      makeTimer("First Timer", &firstTimerID, 2, 2); //2ms 
       makeTimer("Second Timer", &secondTimerID, 10, 10); //10ms 
       makeTimer("Third Timer", &thirdTimerID, 100, 100); //100ms 
      } 

     close(acceptSocket); 
     return 0; 
    } 

int main() 
{ 
    Xcp_Initialize(); 
    CreateSocket(); 
    return 0; 
} 

//API for sending the data to the client. 
void XcpApp_IpTransmit(uint16 XcpPort, Xcp_StatePtr8 pBytes, uint16 numBytes) 
{ 
    struct sockaddr_in client; 

     if ((long)XcpPort==port){ 
       sentbytes = sendto(acceptSocket,(char*)pBytes,(long)numBytes,0, (struct sockaddr*)&client, sizeof(client)); 
     } 
     XcpIp_TxCallback(port,(uint16)sentbytes); 
} 

나는 클라이언트로부터 데이터를 수신하여 응답을 클라이언트에 다시 보내기 위해 서버 측 프로그램을 만들었습니다. recvfrom API를 통해 클라이언트로부터 데이터를 수신 할 수 있지만 나중에 클라이언트에 대한 응답을 XcpApp_IpTransmit (uint16 XcpPort, Xcp_StatePtr8 pBytes, uint16 numBytes) 내에서 sendto api를 통해 클라이언트로 보내야합니다. (이것은 내 프로젝트에서 데이터 전송을 지원하는 API입니다.) 클라이언트는 지정된 포트 및 IP 주소로 데이터를 전송하기위한 도구입니다. struct sockaddr_in 클라이언트를 다시 사용할 수 있습니까? 전송 api에서 ?? 어떤 사람이 나를 도울 수 있니?Linux 운영 체제 용 udp의 sendto api?

답변

0

struct sockaddr_in client; 초기화 된 곳에서 전송 API가 잘못 사용 되었습니까?

초기화 된 소켓 구조를 사용해야합니다. 위의 코드에서 클라이언트로부터 successfuly 데이터를받을 수는 있지만 전송 기능의 client 구조가 NULL이므로 초기화 할 수 없으므로 보낼 수 없습니다. 이

rc=recvfrom(acceptSocket,buf, sizeof(buf), 0, (struct sockaddr*) &client, &len); 

sendto(acceptSocket,buf,rc,0,(struct sockaddr *)&client,sizeof(client)); 

뭔가를 할 또는

void XcpApp_IpTransmit(uint16 XcpPort, Xcp_StatePtr8 pBytes, uint16 numBytes,struct sockaddr* client) 
{ 
     if ((long)XcpPort==port){ 
       sentbytes = sendto(acceptSocket,(char*)pBytes,(long)numBytes,0, (struct sockaddr*)&client, sizeof(client)); 
     } 
     XcpIp_TxCallback(port,(uint16)sentbytes); 
} 
+0

struct sockaddr_in client; // 이것은 XcpApp_IpTransmit() API 내에서 초기화됩니다. XcpApp_IpTransmit API 내에서 매개 변수를 추가하거나 수정할 수 없습니다. – user3345539

+0

내가 전역 변수로 sockaddr_in 클라이언트 구조체로 만들면 sendto와 recvfrom api에서 같은 것을 사용할 수 있습니까 ?? – user3345539

+0

@ user3345539 당신이 방금'client' 선언하지 전송 API를'CreateSocket' API를. 그래서 당신은 둘 중 하나를 사용할 수 있습니다 전역 및 send 및 recv api 또는 클라이언트 참조를 전달할 수 있습니다. API를 보냅니다. –

0

이렇게하면됩니다. SOCK_DGRAM으로 작업 할 때받은 주소 (일반적으로 크기)를 사용하여 언제든지 데이터를 다시 보낼 수 있습니다. 예외는 물론 피어 소켓을 사용할 수 없게되는 경우를 포함합니다. 당신은 단지 하나의 클라이언트가있는 경우

또는, 당신은 기본 원격 피어의 주소를 설정 connect을 사용할 수 있으며 send 그것을 사용합니다 :

sockaddr_in addr; 
socklen_t len; 

len = sizeof(addr); 
x = recvfrom(socket,buf, sizeof(buf), 0, (struct sockaddr*) &addr, &len); 
connect(socket, (struct sockaddr*)addr, len); 
... 
send(socket, buf, bufsize, 0); 
send(socket, buf, bufsize, 0); 
send(socket, buf, bufsize, 0); 

한 의견을하지만. AF_INET을 사용하고 있으며 코드가 올바르게 작동합니다. 하지만 다른 프로토콜과도 호환되도록 만들 수 있습니다. 이를 위해 :

sockadd_storage addr; 
socklen_t len; 

len = sizeof(addr); 
x = recvfrom(socket,buf, sizeof(buf), 0, (struct sockaddr*) &addr, &len); 
... 
sendto(socket,buf,bufsize,0,(struct sockaddr*)addr, len); 

이 유형의 코드는 AF_LOCAL 및 AF_INET6을 포함한 모든 데이터 그램 프로토콜에서 작동합니다.

+0

내가 대신 sendto를로 보낼 수 있습니다 다음과 같이 귀하의 전송 기능에 client 구조를 전달할 수 있습니다

? – user3345539

+0

@ user3345539'connect'를 사용했다면, 예 –

+0

보다 sendto api에 5 개의 매개 변수 만 있습니다. 그게 맞습니까? – user3345539