UDP Sockets in C under Linux
Problem:
The server receives the correct number and prints it, prints correctly the IP address but when it comes to port, it prints rubbish:
What went wrong ?
This is the client, it reads a number from standard input and sends it to the server.
Code:
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
int main() {
int sock, n, nr;
socklen_t length;
struct sockaddr_in server, from;
sock = socket(AF_INET, SOCK_DGRAM, 0);
if(sock < 0) {
printf("Can not create socket in client!\n");
}
memset(&server, 0, sizeof(struct sockaddr_in));
server.sin_family = AF_INET;
server.sin_port = htons(5913);
server.sin_addr.s_addr = inet_addr("127.0.0.1");
length = sizeof(struct sockaddr_in);
scanf("%d",&nr);
nr = htonl(nr);
n = sendto(sock, &nr, sizeof(nr), 0, (const struct sockaddr *)&server, length);
if(n < 0) {
printf("Can not send from client");
}
close(sock);
return 0;
}
This is the server
Code:
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#define N 100
#define M 50
#define K 100
char IP[N][M];
int Arr1[N][K];
int Arr2[N][K];
int main() {
int sock, n, nr;
socklen_t fromlen;
struct sockaddr_in server;
struct sockaddr_in from;
sock = socket(AF_INET, SOCK_DGRAM, 0);
if (sock < 0)
printf("Can not create socket in server\n");
memset(&server, 0, sizeof(struct sockaddr_in));
server.sin_family = AF_INET;
server.sin_port = htons(5913);
server.sin_addr.s_addr = INADDR_ANY;
if(bind(sock, (struct sockaddr *)&server, sizeof(server)) < 0)
printf("Can not bind in server!\n");
fromlen = sizeof(struct sockaddr_in);
while(1) {
unsigned int gen;
n = recvfrom(sock, &nr, sizeof(nr), 0, (struct sockaddr *) &from, &fromlen);
if (n < 0)
printf("Error when receiving in server!\n");
nr = ntohl(nr);
gen = ntohs(from.sin_port);
printf("I have received %d from IP %s and port %u \n",nr,inet_ntoa(from.sin_addr), gen);
}
}