У меня есть приложение с сокетом UDP, где я работаю на стороне сервера.Для тестирования серверной части я собрал простую клиентскую программу на Python, которая отправляет сообщение «Привет, мир, как дела».Затем сервер должен получить сообщение, преобразовать его в верхний регистр и отправить обратно клиенту.Проблема заключается в следующем: я могу наблюдать во время отладки, что сервер получает сообщение, применяет преобразование, отправляет ответ обратно и в конечном итоге ожидает другое сообщение.Однако клиент Python не получает сообщение, а бесконечно ждет ответа от сервера.
Я нашел (вариант) через Интернет, что для того, чтобы клиент получил ответ обратно, ему необходимо привязаться ксервер, который идет вразрез с тем, что я видел в учебнике (Интерфейс программирования Linux).Тем не менее, я попытался привязать клиента к серверу, и программе python не удалось подключиться к линии привязки (не знаю, правильно ли я это сделал).Версия Python 2.7.5.Клиентская программа работает на RedHat, а сервер работает на целевом модуле с Angstrom (он кросс-скомпилирован для 32-разрядного процессора).
Вот код для клиента:
import socket
import os
UDP_IP = "192.168.10.4"
UDP_PORT = 50005
#dir_path = os.path.dirname(os.path.realpath(__file__))
MESSAGE = "hello world how are you"
print "UDP target IP: ", UDP_IP
print "UDP target port: ", UDP_PORT
print "message: ", MESSAGE
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
#sock.bind((UDP_IP, UDP_PORT))
print "Sending message..."
sock.sendto(MESSAGE, (UDP_IP, UDP_PORT))
print "Message sent!"
print "Waiting for response..."
data = sock.recv(1024)
print "Received", repr(data)
И вот код для сервера:
void server_side(void)
{
printf("Server start up.\n");
struct sockaddr_in svaddr;
struct sockaddr_in claddr;
int sfd;
int j;
ssize_t numBytes;
socklen_t len;
char buf[BUF_SIZE];
char claddrStr[INET_ADDRSTRLEN];
//int output = open("test_output.txt", O_WRONLY|O_CREAT, 0664);
printf("Creating new UDP socket...\n");
sfd = socket(AF_INET, SOCK_DGRAM, 0); /* Create Server Socket*/
if (sfd == -1)
{
errExit("socket");
}
printf("Socket has been created!\n");
memset(&svaddr, 0, sizeof(struct sockaddr_in));
svaddr.sin_family = AF_INET;
svaddr.sin_addr.s_addr = htonl(INADDR_ANY);
svaddr.sin_port = htons(PORT_NUM);
printf("Binding in process...\n");
if (bind(sfd, (struct sockaddr *) &svaddr, sizeof(struct sockaddr_in))
== -1)
{
errExit("bind");
}
printf("Binded!\n");
/* Receive messages, convert to upper case, and return to client.*/
for(;;)
{
len = sizeof(struct sockaddr_in);
numBytes = recvfrom(sfd, buf, BUF_SIZE, 0,
(struct sockaddr *) &claddr, &len);
if (numBytes == -1)
{
errExit("recvfrom");
}
if (inet_ntop(AF_INET, &claddr.sin_addr, claddrStr,
INET_ADDRSTRLEN) == NULL)
{
printf("Couldn't convert client address to string.\n");
}
else
{
printf("Server received %ld bytes from (%s, %u).\n", (long)
numBytes,
claddrStr, ntohs(claddr.sin_port));
}
claddr.sin_port = htons(PORT_NUM);
for (j = 0; j< numBytes; j++)
{
buf[j] = toupper((unsigned char) buf[j]);
}
if (sendto(sfd, buf, numBytes, 0, (struct sockaddr *) &claddr, len)
!= numBytes)
{
fatal("sendto");
}
}
}
Опять проблема в том, что я не получаю ответ и не печатаю сообщение обратно на клиентском терминале.Я должен получить одно и то же сообщение заглавными буквами.Я чувствую, что мне не хватает маленькой детали.Спасибо за помощь!