patterncMinor
Two-way communication in TCP: server-client implementation
Viewed 0 times
communicationwaytcptwoclientserverimplementation
Problem
I have written some code to establish a client and server. I have managed to get a one way communication from client to server. I have added the code below. Can someone please have a look and see it is the right way to do it? If this is good enough, how can I get two communication to work now?
Client:
```
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define PORT 3490
#define MAXSIZE 1024
int main(int argc, char *argv[])
{
struct sockaddr_in server_info;
struct hostent *he;
int socket_fd,num;
char buffer[1024];
char buff[1024];
if (argc != 2) {
fprintf(stderr, "Usage: client hostname\n");
exit(1);
}
if ((he = gethostbyname(argv[1]))==NULL) {
fprintf(stderr, "Cannot get host name\n");
exit(1);
}
if ((socket_fd = socket(AF_INET, SOCK_STREAM, 0))== -1) {
fprintf(stderr, "Socket Failure!!\n");
exit(1);
}
memset(&server_info, 0, sizeof(server_info));
server_info.sin_family = AF_INET;
server_info.sin_port = htons(PORT);
server_info.sin_addr = ((struct in_addr )he->h_addr);
if (connect(socket_fd, (struct sockaddr *)&server_info, sizeof(struct sockaddr))<0) {
//fprintf(stderr, "Connection Failure\n");
perror("connect");
exit(1);
}
//buffer = "Hello World!! Lets have fun\n";
//memset(buffer, 0 , sizeof(buffer));
while(1) {
fgets(buffer,MAXSIZE-1,stdin);
if ((send(socket_fd,buffer, strlen(buffer),0))== -1) {
fprintf(stderr, "Failure Sending Message\n");
close(socket_fd);
exit(1);
}
else {
printf("Message being sent: %s\n",buffer);
}
}
/*if ((num = recv(socket_fd, buff, 1024,0))== -1) {
//fprintf(stderr,"Error in receiving message!!\n");
perror("recv");
exit(1);
}
// num = recv(client_fd, buffer, sizeof(buffer),0
Client:
```
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define PORT 3490
#define MAXSIZE 1024
int main(int argc, char *argv[])
{
struct sockaddr_in server_info;
struct hostent *he;
int socket_fd,num;
char buffer[1024];
char buff[1024];
if (argc != 2) {
fprintf(stderr, "Usage: client hostname\n");
exit(1);
}
if ((he = gethostbyname(argv[1]))==NULL) {
fprintf(stderr, "Cannot get host name\n");
exit(1);
}
if ((socket_fd = socket(AF_INET, SOCK_STREAM, 0))== -1) {
fprintf(stderr, "Socket Failure!!\n");
exit(1);
}
memset(&server_info, 0, sizeof(server_info));
server_info.sin_family = AF_INET;
server_info.sin_port = htons(PORT);
server_info.sin_addr = ((struct in_addr )he->h_addr);
if (connect(socket_fd, (struct sockaddr *)&server_info, sizeof(struct sockaddr))<0) {
//fprintf(stderr, "Connection Failure\n");
perror("connect");
exit(1);
}
//buffer = "Hello World!! Lets have fun\n";
//memset(buffer, 0 , sizeof(buffer));
while(1) {
fgets(buffer,MAXSIZE-1,stdin);
if ((send(socket_fd,buffer, strlen(buffer),0))== -1) {
fprintf(stderr, "Failure Sending Message\n");
close(socket_fd);
exit(1);
}
else {
printf("Message being sent: %s\n",buffer);
}
}
/*if ((num = recv(socket_fd, buff, 1024,0))== -1) {
//fprintf(stderr,"Error in receiving message!!\n");
perror("recv");
exit(1);
}
// num = recv(client_fd, buffer, sizeof(buffer),0
Solution
You can do a two way data transfer here. I have modified your code to show that. Now the
server is echoing back to the client the same string which it has received. Now the client
displays the same string, which it receives from the server. Pl. experiment with this.
client main loop
Server main loop
server is echoing back to the client the same string which it has received. Now the client
displays the same string, which it receives from the server. Pl. experiment with this.
client main loop
while(1) {
printf("Client: Enter Data for Server:\n");
fgets(buffer,MAXSIZE-1,stdin);
if ((send(socket_fd,buffer, strlen(buffer),0))== -1) {
fprintf(stderr, "Failure Sending Message\n");
close(socket_fd);
exit(1);
}
else {
printf("Client:Message being sent: %s\n",buffer);
num = recv(socket_fd, buffer, sizeof(buffer),0);
if ( num <= 0 )
{
printf("Either Connection Closed or Error\n");
//Break from the While
break;
}
buff[num] = '\0';
printf("Client:Message Received From Server - %s\n",buffer);
}
}
close(socket_fd);
}//End of mainServer main loop
while(1) {
size = sizeof(struct sockaddr_in);
if ((client_fd = accept(socket_fd, (struct sockaddr *)&dest, &size))==-1 ) {
perror("accept");
exit(1);
}
printf("Server got connection from client %s\n", inet_ntoa(dest.sin_addr));
while(1) {
if ((num = recv(client_fd, buffer, 1024,0))== -1) {
perror("recv");
exit(1);
}
else if (num == 0) {
printf("Connection closed\n");
//So I can now wait for another client
break;
}
buffer[num] = '\0';
printf("Server:Msg Received %s\n", buffer);
if ((send(client_fd,buffer, strlen(buffer),0))== -1)
{
fprintf(stderr, "Failure Sending Message\n");
close(client_fd);
break;
}
printf("Server:Msg being sent: %s\nNumber of bytes sent: %d\n",b
uffer, strlen(buffer));
} //End of Inner While...
//Close Connection Socket
close(client_fd);
} //Outer While
close(socket_fd);
return 0;
} //End of mainCode Snippets
while(1) {
printf("Client: Enter Data for Server:\n");
fgets(buffer,MAXSIZE-1,stdin);
if ((send(socket_fd,buffer, strlen(buffer),0))== -1) {
fprintf(stderr, "Failure Sending Message\n");
close(socket_fd);
exit(1);
}
else {
printf("Client:Message being sent: %s\n",buffer);
num = recv(socket_fd, buffer, sizeof(buffer),0);
if ( num <= 0 )
{
printf("Either Connection Closed or Error\n");
//Break from the While
break;
}
buff[num] = '\0';
printf("Client:Message Received From Server - %s\n",buffer);
}
}
close(socket_fd);
}//End of mainwhile(1) {
size = sizeof(struct sockaddr_in);
if ((client_fd = accept(socket_fd, (struct sockaddr *)&dest, &size))==-1 ) {
perror("accept");
exit(1);
}
printf("Server got connection from client %s\n", inet_ntoa(dest.sin_addr));
while(1) {
if ((num = recv(client_fd, buffer, 1024,0))== -1) {
perror("recv");
exit(1);
}
else if (num == 0) {
printf("Connection closed\n");
//So I can now wait for another client
break;
}
buffer[num] = '\0';
printf("Server:Msg Received %s\n", buffer);
if ((send(client_fd,buffer, strlen(buffer),0))== -1)
{
fprintf(stderr, "Failure Sending Message\n");
close(client_fd);
break;
}
printf("Server:Msg being sent: %s\nNumber of bytes sent: %d\n",b
uffer, strlen(buffer));
} //End of Inner While...
//Close Connection Socket
close(client_fd);
} //Outer While
close(socket_fd);
return 0;
} //End of mainContext
StackExchange Code Review Q#13461, answer score: 8
Revisions (0)
No revisions yet.