程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 編程解疑 >> c語言-linux c socket tcp客戶端只能發送一次,發送第二次服務端接收不到,必須重啟才行

c語言-linux c socket tcp客戶端只能發送一次,發送第二次服務端接收不到,必須重啟才行

編輯:編程解疑
linux c socket tcp客戶端只能發送一次,發送第二次服務端接收不到,必須重啟才行

服務端循環accept,如果每次客戶端只發送一次請求,就沒問題,
但是如果客戶端循環發送數據,服務端就接收不到一次連接中的第二次請求。
下面貼代碼,求解這個問題到底咋回事

服務端 sock_serv.c

#include
#include
#include
#include
#include
#include
#include
#include

#define BACKLOG 10
#define RECVBUF_SIZE 4096
#define PORT 20000

int init_server(int type){
int sockfd;

if ((sockfd = socket(AF_INET, type, 0)) == -1){
    printf("create socker error\n");
    return -1;
}

struct sockaddr_in addrv4;

bzero(&addrv4, sizeof(addrv4));

addrv4.sin_family = AF_INET;
addrv4.sin_port = htons(PORT);
addrv4.sin_addr.s_addr = INADDR_ANY;

if (bind(sockfd, (struct sockaddr *)&addrv4, sizeof(addrv4)) < 0){
    printf ("bind sockfd error\n");
    return -1;
}

if (listen(sockfd, BACKLOG) < 0){
    printf ("listen sockfd error\n");
    return -1;
}

return sockfd;

}

int main(void){
int sockfd, newfd;

if ((sockfd = init_server(SOCK_STREAM)) == -1){
    printf ("server init failed\n");
    exit(1);
}

while (1) {
    struct sockaddr client_addr;
    bzero(&client_addr, sizeof(client_addr));
    socklen_t len = sizeof(client_addr);

    char recvbuf[RECVBUF_SIZE];
    if ((newfd = accept(sockfd, &client_addr, &len)) < 0){
        printf("%s\n", strerror(errno));
        printf ("accept request error\n");
        exit(1);
    }

    printf(" the client fd is :%d\n", newfd);
    printf ("client ip is %s", inet_ntoa(((struct sockaddr_in *)&client_addr)->sin_addr));
    ssize_t ret;
    if ((ret = recv(newfd, recvbuf, RECVBUF_SIZE, 0)) < 0){
        printf("%s\n", strerror(errno));
        printf("recv data error \n");
        exit(1);
    }

    if (ret == 0) {
        printf("always read to EOF\n");
    }

    printf("the client request data is :\n\t\t%s", recvbuf);

    char *resp_data = "the server was recvived success!";

    if (send(newfd, resp_data, strlen(resp_data), 0) == -1){
        printf("response data error\n");
        exit(1);
    }

    //shutdown(newfd, SHUT_RDWR);
    //close(newfd);

    if (strcmp(recvbuf, "exit") == 0){
        shutdown(sockfd, SHUT_RDWR);
        close(sockfd);
    }
}

}


客戶端 sock_client.c

#include
#include
#include
#include
#include
#include
#include

#define BUFSIZE 4096
#define PORT 20000

void error(const char *str){
printf("%s\n"
"the error info is : %s\n", str, strerror(errno));
}

int init_client(){
int sockfd;

if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1){
    error("socket error");
    return -1;
}

struct sockaddr_in addrv4;
bzero(&addrv4, sizeof(addrv4));

addrv4.sin_family = AF_INET;
addrv4.sin_port = htons(PORT);
addrv4.sin_addr.s_addr = inet_addr("127.0.0.1");

if (connect(sockfd, (struct sockaddr *)&addrv4, (socklen_t) sizeof(addrv4)) == -1){
    error("connect error");
    return -1;
}

return sockfd;

}

int main(void){
char consolebuf[BUFSIZE];
char recvbuf[BUFSIZE];
int sockfd, len, recvlen;
if ((sockfd = init_client()) == -1){
error("init client error");
exit(1);
}

while (1){
    printf("input >>");
    if ((len = read(STDIN_FILENO, &consolebuf, BUFSIZE)) == -1){
        error("read data error");
        exit(1);
    }

    if (strcmp(consolebuf, "exit-client") == 0){
        break;
    }

    if (send(sockfd, consolebuf, len, 0) == -1){
        error("send data error");
        exit(1);
    }

    if ((recvlen = recv(sockfd, recvbuf, BUFSIZE, 0)) == -1){
        error("receive the server response error\n");
        exit(1);
    }

    write(STDOUT_FILENO, recvbuf, recvlen);
}

shutdown(sockfd, SHUT_RDWR);
close(sockfd);
exit(0);

}


最佳回答:


http://blog.csdn.net/robertkun/article/details/8702094

qq28970484
qq28970484
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved