2013-07-26 51 views
0

我想使用套接字來獲取一個小的JSON測試文件,這是我的網站(http://a-cstudios.com/text.json)託管。當我這樣做C套接字recv:連接重置由對方

long numbytes; 
char *request = malloc(sizeof(char) * 300); 
sprintf(request, "GET %s \r\nHOST:%s \r\n\r\n", restOfURL, baseServer); 
// restOfURL = "/text.json" baseServer = "www.a-cstudios.com" 
send(sockfd, request, strlen(request) + 1, 0); 
char buf[1024]; 
if ((numbytes = recv(sockfd, buf, 1024-1, 0)) == -1) { 
    perror("recv"); 

} 

我得到recv: connection reset by peer。但是,如果我使用相同的代碼,其中restOfURL/index.htmlbaseServerwww.google.com,此工作正常,buf將包含文本index.html。爲什麼這不適用於我網站上的文件?

+4

GET-request在最後還需要'HTTP/1.1'(或'1.0')嗎? – Kninnug

+0

您發送的HTTP無效,主機正在關閉連接。你把HTTP/1.1放在正確的地方了嗎?爲什麼使用malloc()而不是在堆棧上分配數組? – EJP

+0

@EJP和Kninnug謝謝你指出,這確實解決了這個問題。如果你們其中一人發帖作爲答案,我會接受它。 –

回答

0

既然你沒有張貼完整的代碼,我要採取刺傷它,做一個假設:

你跟restOfURLbaseServer

填充的"GET %s \r\nHOST:%s \r\n\r\n"格式字符串然而,在在sprintf電話restOfURL的時間不initilized所以你推垃圾數據進入第一%s

無論是發佈更多的代碼,或者確保您初始化resOfURL

+0

'restOfURL'是絕對初始化的。我認爲發佈其他代碼是毫無意義的,因爲它確實對錯誤沒有影響。 –

+1

@ChrisLoonam,另一個建議是確保send()發送全部金額,它返回成功發送的字節數。我沒有看到任何明顯缺失或不正確的東西。 –

+0

如果'restOfURL'未初始化,它將爲空,並且會產生SIGSEGV,而不是此行爲。 send()以阻塞模式發送全部金額。你似乎只是在猜測。 – EJP

0

正如@Kninnug所指出的那樣,您需要請求第一行末尾的HTTP版本字段(例如,HTTP/1.1)。我只想指出,發送請求時不應該包含空終止符。也就是說,send聲明改爲

send(sockfd, request, strlen(request), 0); 

而且,這是一個很好的做法,始終使用snprintf而不是sprintf防止緩衝區溢出,但要真正安全的,你仍然需要檢查截斷。