2011-11-24 40 views
0

我試圖編譯在http://www.abc.se/~m6695/udp.html發現這個開源的程序,但它給了一個錯誤消息。服務器程序將在Ubuntu上運行。編譯錯誤與inet_addr和SENDTO

下面是修改代碼:

#include "stdafx.h" 
//#include <windows.h> 
#include <process.h> 
#include <stdio.h> 
#include "winsock2.h" 
#pragma comment(lib, "Ws2_32.lib") 
#define BUFLEN 512 
#define NPACK 10 
#define PORT 9980 

#define SRV_IP "999.999.999.999" 

void diep(char *s) 
    { 
    perror(s); 
    exit(1); 
    } 

int main(void) { 
struct sockaddr_in si_other; 
int s, i, slen = sizeof(si_other); 
char buf[BUFLEN]; 

if ((s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1) 
    diep("socket"); 

memset((char *) &si_other, 0, sizeof(si_other)); 
si_other.sin_family = AF_INET; 
si_other.sin_port = htons(PORT); 
//inet_addr (const) char *SRV_IP); 
if (inet_addr(SRV_IP, &si_other.sin_addr) == 0) { 
//if (inet_aton(SRV_IP, &si_other.sin_addr) == 0) { 
    fprintf(stderr, "inet_aton() failed\n"); 
    exit(1); 
} 

for (i = 0; i < NPACK; i++) { 
    printf("Sending packet %d\n", i); 
    sprintf(buf, "This is packet %d\n", i); 
    if (sendto(s, buf, BUFLEN, 0, &si_other, slen) == -1) 
     diep("sendto()"); 
} 

closesocket(s); 
return 0; 
} 

它提供了以下錯誤:

Error 1 error C2660: 'inet_addr' : function does not take 2 arguments [filepath] 
Error 2 error C2664: 'sendto' : cannot convert parameter 5 from 'sockaddr_in *' to 'const sockaddr *' [filepath] 
+0

你們是不是要在Linux中使用的窗口標題,或者是我錯了嗎? – Constantinius

+0

你說這個程序將在Ubuntu上運行,但是從錯誤('C2660','C2664')看來你正在編譯窗口。如果您從已知可在您的目標平臺上運行的代碼開始,並且在該平臺上開發它,那麼您將會有更多的運氣。如果你沒有一個Ubuntu的方便,抓住'VirtualBox'和一個Ubuntu livecd圖像。設置可用於測試代碼的虛擬機非常簡單。 – Mark

回答

0

inet_addr只需一個說法,我想你了示例代碼是從一個不同類型的系統。在這裏看到:http://linux.die.net/man/3/inet_addr和呼叫更改爲類似:

if ((si_other.sin_addr = inet_addr(SRV_IP) != INADDR_NONE) { 

對於sendto調用,你可能只需要參數轉換爲所需要的類型,在編譯器錯誤給出。