0

接続が確立されるまでサーバー(VB 6.0)に接続しようとしているクライアント(C)を作成しました。サーバーがリッスンする準備ができていて、接続してメッセージを送信しようとするクライアントプログラムを実行すると、サーバーは正常に機能し、クライアント側で応答を受信します。ただし、サーバーの前にクライアントプログラムを起動すると、サーバーが接続されるまで(無限ループで)、短い間隔でサーバーに接続しようとします。サーバーの電源を入れると、クライアントはサーバーに正常に接続しますが、メッセージは送信されません。この場合、問題を見つけることができません。クライアントがメッセージを送信しないことを「wireshark」でチェックインしました。

サーバーがクライアントの前で実行されているときにプログラムが正常に動作するのはなぜですか。それ以外の場合はそうではありません。

問題を見つける方法を提案してください。クライアントプログラムのコードは次のとおりです。

int
tcp_send()
{
    int sd, newSd, rc, i, cliSd, servLen, num, k, p;
    struct sockaddr_in servAddr;
    struct hostent *h;
    char si[4];
    char line[MAX_MSG];
    char message[MAX_MSG];
    struct  timeval tp;
    time_t now;
    char msg[MAX_MSG];  
    char str[MAX_MSG];

    strcpy(msg, "Hello World");

    servAddr.sin_family = AF_INET;
    servAddr.sin_addr.s_addr = inet_addr("111.1.1.11");
    servAddr.sin_port = htons(SERVER_PORT);

    /* create socket */
    sd = socket(AF_INET, SOCK_STREAM, 0);
    if(sd<0) 
    {
        exit(1);
    }
    rc = -1;    
    for (;rc!=0;)
    {
        /* connect to server */
        rc = connect(sd, (struct sockaddr *) &servAddr, sizeof(servAddr));
        if(rc<0) 
        {
            sleep(2);
        }

    }

    memset(message, 0, sizeof(message));
    memset(si, 0, sizeof(si));
    num = strlen(msg);
    integertostring(si, num, 4);
    memcpy(message, si, 4);
    memcpy(message + strlen(message), msg, strlen(msg));

    rc = send(sd, message, strlen(message), 0);
    if(rc<0)
    {
      close(sd);
      exit(1);

    }

    sleep(1);
    read_line(sd,line);
    memset(line,0x0,MAX_MSG);

    return SUCCESS;
}
4

1 に答える 1

4

close失敗した後でソケットを試して、connect再作成してください。

于 2012-08-30T11:59:51.100 に答える