2013-05-27 4 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); 

EDIT:

Как @nos говорит, что есть риск переполнения, если outMsg не объявлен как char outMsg[MAX_MSG_LEN + 1];

Лучшим выбором было бы использовать strlen(whatever) в recvfrom вместо MAX_MSG_LEN для определения длины.

+0

Хорошо, я уже их сменил. Я попытался запустить эту программу, а затем на двух разных терминалах в качестве отдельных хостов. Мое сообщение отправлено без ошибок, но другая сторона все еще ничего не получила. Как получилось? – Broccoli

+0

@nos, вы правы спасибо, отредактировал –

+0

@Broccoli Трудно сказать из кода, который вы опубликовали. Однако опубликованный код требует, чтобы кто-то сначала отправлял данные, а не отвечал на одно входящее сообщение. Вы должны научиться использовать wirehark для отладки сообщений на проводе (чтобы вы могли видеть, действительно ли отправлены сообщения, имеют правильные адреса, номера портов, контент и т. Д.). – nos

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