2015-10-08 35 views
-1

我在c中創建了一個服務器程序,當我嘗試首先連接服務器時它工作正常,但我斷開客戶端並連接第二次,沒有任何反應。請找到我的源代碼。C Socket - 無法重新連接服務器

服務器代碼:

主要方法

int main(int argc, char** argv) { 
printf(">>>>Server Started!<<<<\n"); 
while(server() == -1) { 
    printf(">>>>>>Restarting the Server....<<<<<<.\n"); 
} 
printf(">>>>Server Stopped!<<<<\n"); 
return (EXIT_SUCCESS); 
} 

Server代碼

#define INTERVAL 3 
#define PORT 7777 
#define MAX_OUTSTATLEN 1000000 
#define MAX_STATLEN 100000 
#define MAX_CLIMSGLEN 2000 

int server() { 
#ifdef _WIN32 
    SOCKET agent_socket, client_socket; 
    WSADATA wsadata; 
    if (WSAStartup(MAKEWORD(2, 2), &wsadata) != 0) { 
     printf("Initializing WinSock Failed.\n"); 
     return 1; 
    } 
#else 
    int agent_socket, client_socket; 
#endif 
    struct sockaddr_in agent, client; 
    char *outStat, client_message[MAX_CLIMSGLEN], timestamp[0]; 
    int client_socket_len, isReconnet = 1, x = 0; 
    if ((agent_socket = socket(AF_INET, SOCK_STREAM, 0)) < 0) { 
     printf("Agent creation failed.\n"); 
     return -1; 
    } else { 
     printf("Agent creation successful.\n"); 
    } 
    memset(&agent, 0, sizeof agent); 
    memset(&client, 0, sizeof client); 
    agent.sin_family = AF_INET; 
    agent.sin_port = htons(PORT); 
    agent.sin_addr.s_addr = INADDR_ANY; 
    if(setsockopt(agent_socket, SOL_SOCKET, SO_REUSEADDR, &isReconnet, sizeof(int)) == -1) { 
     printf("Unable to set Socket Option.\n"); 
    } 
    if (bind(agent_socket, (struct sockaddr*)&agent, sizeof(agent)) != 0) { 
     printf("Agent bind failed.\n"); 
     return -1; 
    } else { 
     printf("Agent bind successful.\n"); 
    } 
    if (listen(agent_socket, 20) != 0) { 
     printf("Can't listen on the Port.\n"); 
     return -1; 
    } else { 
     printf("Waiting for client...\n"); 
    } 
    client_socket_len = sizeof (struct sockaddr_in); 
#ifdef _WIN32 
    client_socket = accept(agent_socket, (struct sockaddr *) &client, &client_socket_len); 
#else 
    client_socket = accept(agent_socket, (struct sockaddr *) &client, (socklen_t*) & client_socket_len); 
#endif 
    if (client_socket < 0) { 
     printf("can't accept the Client.\n"); 
     return -1; 
    } else { 
     printf("Agent connected to client.\n"); 
    } 
    if (recv(client_socket, client_message, MAX_CLIMSGLEN, 0) > 0) { 
     send(client_socket, client_message, strlen(client_message), 0); 
     while (1) { 
      outStat = malloc(MAX_OUTSTATLEN * sizeof (char)); 
      *outStat = '\0'; 
      strcat(outStat, "Some String to Client"); 
      printf("%s\n", outStat); 
      if (recv(client_socket, client_message, MAX_CLIMSGLEN, 0) > 0) { 
       send(client_socket, outStat, strlen(outStat), 0); 
      } else { 
       printf("Unable to reach the client.\n"); 
       close(client_socket); 
       close(agent_socket); 
       return -1; 
      } 
#ifdef _WIN32 
      Sleep(INTERVAL * 1000); 
#else 
      sleep(INTERVAL); 
#endif 
     } 
    } else { 
     printf("Message receive failed.\n"); 
     close(client_socket); 
     close(agent_socket); 
     return -1; 
    } 
    return 0; 
} 

客戶端代碼:(JAVA)

public class Test { 
public static void main(String[] args) throws UnknownHostException, IOException { 
    Socket echoSocket = new Socket("10.8.157.7", 7777); 
    PrintWriter out = new PrintWriter(echoSocket.getOutputStream(), true); 
    BufferedReader in = new BufferedReader(new InputStreamReader(echoSocket.getInputStream())); 
    BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in)); 
    out.println("Send Messages"); 
    while(true){ 
     out.println("OK"); 
     System.out.println(in.readLine()); 

    } 
} 
} 
+0

嘗試打開與SO_REUSEADDR = true的套接字 – BlackJoker

+0

將嘗試:-) – Ulaganathan

回答

0

您將需要包裝的代碼了在for循環或while循環中以便服務器不止一次地接受連接。

+0

你能提供一些例子嗎? – Ulaganathan

+2

@Ulaganathan你需要一個循環的例子嗎? – EJP

相關問題