I try to initial a UDP client from threading, but it doesn't work? why?
These codes from the textbook
Code:
#define ECHOMAX 255 /* Longest string to echo */
#define TIMEOUT_SECS 2 /* Seconds between retransmits */
#define MAXTRIES 5 /* Tries before giving up */
int tries=0; /* Count of times sent - GLOBAL for signal-handler access */
void CatchAlarm(int ignored) /* Handler for SIGALRM */
{
tries += 1;
}
static void DieWithError(char *errorMessage)
{
perror(errorMessage);
exit(1);
}
void TCP () {
int sock; /* Socket descriptor */
struct sockaddr_in echoServAddr; /* Echo server address */
struct sockaddr_in fromAddr; /* Source address of echo */
unsigned short echoServPort; /* Echo server port */
unsigned int fromSize; /* In-out of address size for recvfrom() */
struct sigaction myAction; /* For setting signal handler */
char *servIP; /* IP address of server */
char *echoString; /* String to send to echo server */
char echoBuffer[ECHOMAX+1]; /* Buffer for echo string */
int echoStringLen; /* Length of string to echo */
int respStringLen; /* Size of received datagram */
//The IP is invalid since I need to test the function about timeout!!
servIP = "192.168.1.254"; /* First arg: server IP address (dotted quad) */
echoString = "abc"; /* Second arg: string to echo */
if ((echoStringLen = strlen(echoString)) > ECHOMAX)
DieWithError("Echo word too long");
echoServPort = atoi("12345"); /* Use given port, if any */
/* Create a best-effort datagram socket using UDP */
if ((sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0)
DieWithError("socket() failed");
/* Set signal handler for alarm signal */
myAction.sa_handler = CatchAlarm;
if (sigfillset(&myAction.sa_mask) < 0) /* block everything in handler */
DieWithError("sigfillset() failed");
myAction.sa_flags = 0;
if (sigaction(SIGALRM, &myAction, 0) < 0)
DieWithError("sigaction() failed for SIGALRM");
/* Construct the server address structure */
memset(&echoServAddr, 0, sizeof(echoServAddr)); /* Zero out structure */
echoServAddr.sin_family = AF_INET;
echoServAddr.sin_addr.s_addr = inet_addr(servIP); /* Server IP address */
echoServAddr.sin_port = htons(echoServPort); /* Server port */
/* Send the string to the server */
if (sendto(sock, echoString, echoStringLen, 0, (struct sockaddr *)
&echoServAddr, sizeof(echoServAddr)) != echoStringLen)
DieWithError("sendto() sent a different number of bytes than expected");
/* Get a response */
fromSize = sizeof(fromAddr);
alarm(TIMEOUT_SECS); /* Set the timeout */
When I call this function from a thread, it is blocking here, and no response anymore!
while ((respStringLen = recvfrom(sock, echoBuffer, ECHOMAX, 0,
(struct sockaddr *) &fromAddr, &fromSize)) < 0) {
if (errno == EINTR) /* Alarm went off */
{
if (tries < MAXTRIES) /* incremented by signal handler */
{
printf("timed out, %d more tries...\n", MAXTRIES-tries);
if (sendto(sock, echoString, echoStringLen, 0, (struct sockaddr *)
&echoServAddr, sizeof(echoServAddr)) != echoStringLen)
DieWithError("sendto() failed");
alarm(TIMEOUT_SECS);
}
else
DieWithError("No Response");
}
else
DieWithError("recvfrom() failed");
}
/* recvfrom() got something -- cancel the timeout */
alarm(0);
/* null-terminate the received data */
echoBuffer[respStringLen] = '\0';
printf("Received: %s\n", echoBuffer); /* Print the received data */
close(sock);
exit(0);
}
I am unable to open the mimesender thread. I get the following message when clicking on https://www.unix.com/showthread.php?p=33233#post33233 : (2 Replies)
Hi
I want a UDP client receiving program. Here is the scenario. The client has to listen to the UDP server and has to acknowledge back on receiving data from the server. Can anyone help me out.
regards,
Nirmala (1 Reply)
Hi,
Am very new to socket programming.
When we use UDP sockets to communicate between two processess,
will both the client/server socket be able to send/recv ?
meaning can sendto()/ recvfrom() be used on both server and client?
It could be useful even if anybody provide some link on socket... (1 Reply)
Hi,
I have a situation where i need to communicate a linux client with a windows server, I am using a UDP socket communication channel. I am able to send packets from my linux clients to the windows server but unable to receive any data packet from the server. Do i need to make any setting in... (0 Replies)
I am unable to post reply to a thread. Whenever I will reply to any post I get the message every time :
The message you have entered is too short. Please lengthen your message to at least 5 characters.
Even though length of the message is more than required.
for example I tried to post
... (3 Replies)
Discussion started by: Unregistered
3 Replies
9. Forum Support Area for Unregistered Users & Account Problems
Hi.
I registered, but when trying to post, I get ...
"Sorry, you do not have enough Bits to post a new thread"
Google & Forum search showed some hits, but no solution.
Please advide.
Thanks! (1 Reply)