두 개의 프로그램을 연결하는 중간 코드로 다음 코드를 작성했습니다. 두 개의 다른 시스템에서 실행중인 서버 프로그램과 클라이언트 프로그램이 있습니다. 이 코드는이 두 프로그램의 중간 역할을 할 것으로 예상됩니다.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>
//Connect with program on server side
char * serv_con(char app_data[50])
{
int sock, bytes_recieved;
char send_data[1024];
char *recv_data = malloc(1024);
struct hostent *host;
struct sockaddr_in server_addr;
host = gethostbyname("10.47.3.249");
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
perror("Socket");
exit(1);
}
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(3128);
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);
}
bytes_recieved=recv(sock,recv_data,1024,0);
recv_data[bytes_recieved] = '\0';
send(sock, app_data, 50, 0);
return recv_data;
//close(sock);
}
//Connect with client app
char * cli_con(char ser_data[50])
{
int sock, connected, bytes_recieved , true = 1;
char send_data [1024];
char *recv_data = malloc(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 bind1");
exit(1);
}
if (listen(sock, 5) == -1)
{
perror("Listen");
exit(1);
}
sin_size = sizeof(struct sockaddr_in);
connected = accept(sock, (struct sockaddr *)&client_addr,&sin_size1);
printf("\n I got a connection from (%s , %d)",inet_ntoa(client_addr.sin_addr),ntohs(client_addr.sin_port));
bytes_recieved = recv(connected,recv_data,1024,0);
recv_data[bytes_recieved] = '\0';
send(connected, ser_data,50, 0);
//close(sock);
}
int main()
{
char *ser_data, *app_data;
int pid = fork();
while(1)
{
if(pid == 0)
app_data = serv_con(ser_data);
else
ser_data = cli_con(app_data);
}
}
클라이언트 측 응용 프로그램이 실행될 때까지 정상적으로 작동합니다. 그러나 즉시 클라이언트 측 응용 프로그램이 실행되는 오류주는 코드 출구 : 나는 코드에서 확인해야 어떤 수정
Unable to bind: Address already in use
I got a connection from (192.168.0.3 , 45691)
이 오류를 해결하기를? 나는 리눅스에서 일하고있다. 미리 감사드립니다.
편집 : close(sock)
에서 주석을 제거했으며 을 추가했습니다. 기능은 cli_con
입니다. 클라이언트 측 코드는 아래와 같습니다 :
int sock, bytes_recieved;
char send_data[1024],recv_data[1024];
struct hostent *host;
struct sockaddr_in server_addr;
host = gethostbyname("192.168.0.2");
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
perror("Socket");
exit(1);
}
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(5555);
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)
{
//necessary codes
if (connect(sock, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) == -1)
{
close(sock);
goto connct;
}
}
하지만 지금 실행에, 첫 번째 프로그램이 종료 doesnot 그러나 심지어
I got a connection from (192.168.0.3 , 45691)
를 인쇄 doesnot 그러나 다만 어떤 메시지를 인쇄하지 않고 실행에 유지합니다. 하지만 다른 한편으로는 클라이언트가 오류를 보여주는 것으로 끝납니다 :
Connect: Connection reset by peer
이제 어떻게해야합니까?
"(192.168.0.3, 45691)과의 연결이 있습니다."-이 또한 인쇄됩니까? 바인드 오류로 인해 코드가 종료되면 어떻게 가능합니까? – Jay
글쎄, 나는 그것이 while 회 돌이라고 생각한다. 처음으로 연결을 얻었고 두 번째로 루프에 들어가면 바인드 오류가 표시되어 종료됩니다. 어떤 생각을해야합니까? –