2013-05-27 93 views
0

我昨天發佈了一個問題,並得到了一些有用的反饋!所以,我定了很多我的代碼,現在我有這個問題是從recvfrom()提取數據,並printf()顯示它們,這裏是我的代碼:recvfrom()套接字編程Ubuntu

clientAddr.sin_family = AF_INET; 
clientAddr.sin_addr.s_addr = htonl(INADDR_ANY); 
userIP.s_addr = RespMessage.user[i].ipAddr; 
clientAddr.sin_addr.s_addr = userIP.s_addr; 

printf("Username FOUND! What do you want to say? \n"); 
fgets(inMsg, MAX_MSG_LEN, stdin); 
chatMsg = (UDPchat_t *)inMsg; 

send = sendto(UDP_socketID, chatMsg->message, sizeof(chatMsg->message), 0, (struct sockaddr*)&clientAddr, size_c); 
if (send < 0) 
{ 
     printf("Sending failure : %d", errno); 
     continue; 
} 
else 
{ 
     printf("Message sent!\n"); 
     continue; 
} 

outMsgLen = recvfrom(UDP_socketID, outMsg, MAX_MSG_LEN, 0, (struct sockaddr *)&clientAddr, (socklen_t*)&size_c); 
send = gettimeofday(&timeVal, NULL); 
curtime = timeVal.tv_sec; 
printf("[%ld] Rcvd pkt from: ", outMsgLen); 

請幫幫忙!謝謝。

+4

問題是什麼?如果你正在尋找代碼審查工作代碼,你應該問[codereview.se]來代替。 – Hasturkun

+3

這裏有什麼問題? – shazin

+0

對不起,我沒有正確澄清..我的問題是如何從recvfrom()中提取消息以顯示在printf()中? – Broccoli

回答

1

outMsgLen是由recvfrom

接收的字節數。如果你想顯示的文字:

outMsg[outMsgLen] = '\0'; 
printf("%s\n", outMsg); 

編輯:

由於@nos說,有如果outMsg未聲明爲char outMsg[MAX_MSG_LEN + 1];

更好的選擇是使用strlen(whatever)中的recvfrom而不是MAX_MSG_LEN來確定長度。

+0

好的,我已經改變了它們。我嘗試運行這個程序,然後在兩個不同的終端作爲單獨的主機..我的消息發送沒有錯誤,但對方仍然無法收到任何東西..怎麼回事? – Broccoli

+0

@nos,你是對的謝謝,編輯 –

+0

@Broccoli很難從你發佈的代碼中分辨出來。儘管發佈的代碼要求任何人先發送數據,但不會對單個傳入消息做出響應。你應該學會如何使用wireshark來調試線路上的消息(這樣你就可以看到消息是否真的被髮送,擁有正確的地址,端口號,內容等)。 – nos