I need help with multithreading in C ?

April 10, 2010 at 05:55:34
Specs: Windows Vista
this is the server code :

/* tcpserver.c */

#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 <errno.h>
#include <string.h>


int main()
{
int sock, connected, bytes_recieved , true = 1;
char send_data [1024] , recv_data[1024];

struct sockaddr_in server_addr,client_addr;
int sin_size;

if ((sock = socket(AF_INET, SOCK_STREAM,
0)) == -1) {
perror("Socket");
exit(1);
}

if
(setsockopt(sock,SOL_SOCKET,SO_REUSEADDR
,&true,sizeof(int)) == -1) {
perror("Setsockopt");
exit(1);
}

server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(5000);
server_addr.sin_addr.s_addr = INADDR_ANY;
bzero(&(server_addr.sin_zero),8);

if (bind(sock, (struct sockaddr *)&server_addr,
sizeof(struct sockaddr))
==
-1) {
perror("Unable to bind");
exit(1);
}

if (listen(sock, 5) == -1) {
perror("Listen");
exit(1);
}

printf("\nTCPServer Waiting for client on port
5000");
fflush(stdout);


while(1)
{

sin_size = sizeof(struct sockaddr_in);

connected = accept(sock, (struct sockaddr
*)&client_addr,&sin_size);

printf("\n I got a connection from (%s , %d)",

inet_ntoa(client_addr.sin_addr),ntohs(client_addr.sin
_port));

while (1)
{
printf("\n SEND (q or Q to quit) : ");
gets(send_data);

if (strcmp(send_data , "q") == 0 ||
strcmp(send_data , "Q") == 0)
{
send(connected,
send_data,strlen(send_data), 0);
close(connected);
break;
}

else
send(connected,
send_data,strlen(send_data), 0);

bytes_recieved =
recv(connected,recv_data,1024,0);

recv_data[bytes_recieved] = '\0';

if (strcmp(recv_data , "q") == 0 ||
strcmp(recv_data , "Q") == 0)
{
close(connected);
break;
}

else
printf("\n RECIEVED DATA = %s " ,
recv_data);
fflush(stdout);
}
}

close(sock);
return 0;
}

this is the client code :

/* tcpclient.c */

#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>


int main()

{

int sock, bytes_recieved;
char send_data[1024],recv_data[1024];
struct hostent *host;
struct sockaddr_in server_addr;

host = gethostbyname("127.0.0.1");

if ((sock = socket(AF_INET, SOCK_STREAM,
0)) == -1) {
perror("Socket");
exit(1);
}

server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(5000);
server_addr.sin_addr = *((struct in_addr *)host-
>h_addr);
bzero(&(server_addr.sin_zero),8);

if (connect(sock, (struct sockaddr
*)&server_addr,
sizeof(struct sockaddr)) == -1)
{
perror("Connect");
exit(1);
}

while(1)
{

bytes_recieved=recv(sock,recv_data,1024,0);
recv_data[bytes_recieved] = '\0';

if (strcmp(recv_data , "q") == 0 ||
strcmp(recv_data , "Q") == 0)
{
close(sock);
break;
}

else
printf("\nRecieved data = %s " , recv_data);

printf("\nSEND (q or Q to quit) : ");
gets(send_data);

if (strcmp(send_data , "q") != 0 &&
strcmp(send_data , "Q") != 0)
send(sock,send_data,strlen(send_data), 0);

else
{
send(sock,send_data,strlen(send_data), 0);
close(sock);
break;
}

}
return 0;
}


Now I need someone to help me doing the following
:
In the Server code you should modify it to do the
following:
1) Accept and handle more than one connection
simultaneously
2) Accept clients registration requests
3) Save the IP address of the registered client and
map it to the name the client provided when
registering
4) Accept the invite requests and search for the
callee IP address to forward the request
We will have two client codes one for caller and the
other for callee
In the Client code you should modify it to do the
following:
1) Connect to the server and send registration name
and IP Address
2) Send an invite request with the callee name
3) Accept invite requests from the caller

When running the sever and the two clients, we
should see the message sequence of SIP protocol
and test the call setup.

This's my very first task in C and I didn't use it
before today :(:( anyone can help me ?


See More: I need help with multithreading in C ?

Report •

#1
April 10, 2010 at 06:35:47
Threading, socket connections, multiple users and:

This's my very first task in C and I didn't use it
before today :(:( anyone can help me ?

I hope you have quite an aptitude for programming and problem solving in general..... What did you do? Butter up your resume?


1) Accept and handle more than one connection
simultaneously
2) Accept clients registration requests
3) Save the IP address of the registered client and
map it to the name the client provided when
registering
4) Accept the invite requests and search for the
callee IP address to forward the request
We will have two client codes one for caller and the
other for callee
In the Client code you should modify it to do the
following:
1) Connect to the server and send registration name
and IP Address
2) Send an invite request with the callee name
3) Accept invite requests from the caller


I don't know about anyone else, but I'm not planning to:

A: Understand all of the logic of the code.
B: Search for ways to fix said logic in plain C without even knowing the target OS'.
C: Fix said logic to submission standard.

I know I have been a little blunt but perhaps you could narrow down your problem a bit more than your original criteria.


Report •

#2
April 10, 2010 at 07:42:47
Thank You

Report •

#3
April 10, 2010 at 08:21:40
There is no need to thank me, I didn't really give any help.....


I didn't mean to be rude, I just really don't understand how anyone can be dropped into complex problems in any language without at least getting to know the language a little first.


I not saying you can't ask for help and I'm certainly not saying you should go without. You just need to be a LOT more specific.

-> What operating systems are the targets? When you start accessing socket/network/threading functions you may find it easier or even necessary to target specific platforms.

-> What exactly is giving you trouble? I can see you have some code already(which actually puts you ahead of some users that come here ;)), which shows your at least trying. It can make things so much easier to know where you having problems rather than trying to find it from the code alone ;)


Personally I may not be able to answer the question, but it gives you a better chance of getting an answer.

BTW: Is this intended for plain C or C++(at a glance it looks like plain C)?


Report •

Related Solutions

#4
April 10, 2010 at 10:00:38
yea it's a plane C .. and as I said before i have a code but I need
to modify it to do a , b and c .. I'm using windows vista but my
target is to do multi threading and others requirments I
mentioned above ...

Report •

Ask Question