Mình cần viết hai file là client.c
và server_relay.c
hay client.java
và server_relay.java
có nghĩa là như vầy:
Tin nhắn từ client(1)
gửi đến server_relay
(hiện tin nhắn) và truyền đến client(2)
và ngược lại như sau
client (1) <==> server_relay <==> client (2)
(chỉ có 1 file client.c)
client(1) > hi
server_relay :>hi
client (2): < hi
---
client(2) : < hi
: > hello
server_relay : > hi
: < hello
client (1): < hi
: < hello
cơ bản là nó hoạt động như thế
Khi mình chạy file client.c
và server_relay.c
trên terminal của linux, tin nhắn của client (1)
đi qua và hiện lên trên server_relay
và hiện trên client (2)
và ngược lại (giống như yahoo chat vậy)
Dựa vào cái đề mình đã viết được file proxy nhưng mình cần file này vùa có chức năng server và proxy để tạo thành file server_relay
Mình để file C mình đã viết và đề bài trong file zip bạn nào coi hộ mình với và giúp mình với, đây là link file của mình http://ge.tt/9RNrtNO2/v/0?c3
Code hiện có:
client.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
void error(const char *msg)
{
perror(msg);
exit(0);
}
int main(int argc, char *argv[])
{
int sockfd, portno, n;
struct sockaddr_in serv_addr;
struct hostent *server;
char buffer[256];
if (argc < 3) {
fprintf(stderr,"usage %s hostname port\n", argv[0]);
exit(0);
}
portno = atoi(argv[2]);
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0)
error("ERROR opening socket");
server = gethostbyname(argv[1]);
if (server == NULL) {
fprintf(stderr,"ERROR, no such host\n");
exit(0);
}
bzero((char *) &serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
bcopy((char *)server->h_addr,
(char *)&serv_addr.sin_addr.s_addr,
server->h_length);
serv_addr.sin_port = htons(portno);
if (connect(sockfd,(struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0)
error("ERROR connecting");
printf("Please enter the message: ");
bzero(buffer,256);
fgets(buffer,255,stdin);
n = write(sockfd,buffer,strlen(buffer));
if (n < 0)
error("ERROR writing to socket");
bzero(buffer,256);
n = read(sockfd,buffer,255);
if (n < 0)
error("ERROR reading from socket");
printf("%s\n",buffer);
close(sockfd);
return 0;
}
##proxy.c
/* A simple server in the internet domain using TCP
The port number is passed as an argument */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
//error function as uses lots
void error(const char *msg)
{
perror(msg);
exit(1);
}
int main(int argc, char *argv[])
{
//declarations
int sockfd, newsockfd, sendsockfd, serv_portno, cli_portno, n;
struct sockaddr_in serv_addr, host_addr, cli_addr;
socklen_t clilen;
struct hostent *host;
char buffer[65556];
if (argc < 4) {
fprintf(stderr,"usage %s hostname serverport hostport\n", argv[0]);
exit(0);
}
serv_portno = atoi(argv[3]);
cli_portno = atoi(argv[2]);
//creating socket for server to accept connections
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) error("ERROR opening socket");
//creating socket for client component to send on
sendsockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sendsockfd < 0) error("ERROR opening socket");
//setting up the server component of the proxy
bzero((char *) &serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET; //set address family for address (must be IPV4 as defined by AF_INET)
serv_addr.sin_addr.s_addr = INADDR_ANY; //gets ip address of server
serv_addr.sin_port = htons(serv_portno); //assign port number after ensuring it is big-endian
//set up client part of proxy
host = gethostbyname(argv[1]);
if (host == NULL) {
fprintf(stderr,"ERROR, no such host\n");
exit(0);
}
bzero((char *) &host_addr, sizeof(host_addr));
host_addr.sin_family = AF_INET;
bcopy((char *)host->h_addr, (char *)&host_addr.sin_addr.s_addr,host->h_length);
host_addr.sin_port = htons(cli_portno);
if (connect(sendsockfd,(struct sockaddr *) &host_addr,sizeof(host_addr)) < 0)
error("ERROR connecting");
//bind socket to defined address and port, throw error if binding fails.
if (bind(sockfd, (struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0) error("ERROR on binding");
//listen for connection requests, 5 defines max quantity of connections waiting to be processed.
listen(sockfd,5);
clilen = sizeof(cli_addr);
//accept a new socket (accept is a blocking call, thus will wait for client connection to be established)
while(1){
newsockfd = accept(sockfd,(struct sockaddr *) &cli_addr, &clilen);
//throw error if accept returns negative
if (newsockfd < 0)
error("ERROR on accept");
//set the buffer to zero
bzero(buffer,256);
//read from the new socket fd into the buffer
n = read(newsockfd,buffer,255);
//if n is negative error is thrown
if (n < 0) error("ERROR reading from socket");
//display message
printf("Here is the message: %s\n",buffer);
//write message to next host
n = write(sendsockfd,buffer,strlen(buffer));
if (n < 0)
error("ERROR writing to socket");
bzero(buffer,256);
//send ack of correct message delivery
n = write(newsockfd,"I got your message",18);
if (n < 0) error("ERROR writing to socket");
//close sockets to free up file descriptor table.
close(newsockfd);
}
close(sockfd);
return 0;
}
##server2.c
/* A simple server in the internet domain using TCP
The port number is passed as an argument */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
void error(const char *msg)
{
perror(msg);
exit(1);
}
int main(int argc, char *argv[])
{
int sockfd, newsockfd, portno;
socklen_t clilen;
char buffer[1600];
struct sockaddr_in serv_addr, cli_addr;
int n;
if (argc < 2) {
fprintf(stderr,"ERROR, no port provided\n");
exit(1);
}
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0)
error("ERROR opening socket");
bzero((char *) &serv_addr, sizeof(serv_addr));
portno = atoi(argv[1]);
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = htons(portno);
if (bind(sockfd, (struct sockaddr *) &serv_addr,
sizeof(serv_addr)) < 0)
error("ERROR on binding");
while(argc = 0)
{
listen(sockfd,5);
clilen = sizeof(cli_addr);
newsockfd = accept(sockfd,
(struct sockaddr *) &cli_addr,
&clilen);
if (newsockfd < 0)
error("ERROR on accept");
bzero(buffer,1600);
n = read(newsockfd,buffer,1600);
if (n < 0) error("ERROR reading from socket");
printf("Here is the message: %s\n",buffer);
n = write(newsockfd,"I got your message",18);
if (n < 0) error("ERROR writing to socket");
}
close(newsockfd);
close(sockfd);
return 0;
}
Bài này có thể viết bằng java nhưng mình không biết về java bên computer networking
Mình xin càm ơn mọi người trong diễn đàn nhiều lắm