I've just started learning how to do network programming (on Linux), and I'm trying to make a simple UDP client/server (both running on the same machine). While the server runs forever, the client sends a message, receives and prints a response, and then shuts down. However, the client never does any output, but just runs infinitely. I've used the debugger to determine that both the client and the server get stuck in an infinite loop on the calls to recvfrom(). I'm not really sure what the problem could be, so if anyone could help, I'd appreciate it.
server.c:
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
char* handlemsg(char msg[]);
int main()
{
int sock, newsock;
char msg[255];
struct sockaddr_in my_addr;
struct sockaddr_in their_addr;
sock = socket(AF_INET, SOCK_DGRAM, 0);
if (sock == -1)
{
printf("Error creating socket");
exit(1);
}
my_addr.sin_family = AF_INET;
my_addr.sin_port = 5955;
my_addr.sin_addr.s_addr = INADDR_ANY;
int err = bind(sock, (struct sockaddr *)&my_addr, sizeof my_addr);
if (err == -1)
{
printf("Error calling bind");
exit(1);
}
listen(sock, 20);
int sin_size = sizeof their_addr;
for (;;)
{
recvfrom(sock, msg, 254, 0,
(struct sockaddr *)&their_addr,
sizeof(struct sockaddr));
char* output = handlemsg(msg); /*Write*/
sendto(sock, output, strlen(output), 0,
(struct sockaddr *)&their_addr,
sizeof(struct sockaddr));
}
return 0;
}
char* handlemsg(char msg[])
{
if (msg[0] == 't')
{
return "ok";
}
else return "I got the message.";
}
client.c:
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char* argv[])
{
int sock;
struct sockaddr_in their_addr;
struct sockaddr_in addr;
char output[255];
sock = socket(AF_INET, SOCK_DGRAM, 0);
if (sock == -1)
{
printf("Error calling socket");
exit(1);
}
their_addr.sin_family = AF_INET;
their_addr.sin_port = htons(5955);
their_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
memset(their_addr.sin_zero, '\0', sizeof their_addr.sin_zero);
int err = sendto(sock, argv[1], strlen(argv[1]), 0,
(struct sockaddr *)&their_addr,
sizeof (struct sockaddr));
if (err == -1)
{
printf("Error with sendto");
exit(1);
}
recvfrom(sock, output, 254, 0, (struct sockaddr *)&addr,
sizeof (struct sockaddr));
for (int i = 0; i < 255; ++i)
printf("%c", output);
return 0;
}