linux c socket tcp客户端只能发送一次,发送第二次服务端接收不到,必须重启才行-问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

linux c socket tcp客户端只能发送一次,发送第二次服务端接收不到,必须重启才行

2016-07-18 15:08:35 5086 1

服务端循环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);
}
取消 提交回答
全部回答(1)
相关问答

1

回答

TCP/IP协议的发展历史是怎样的呢?

2022-08-09 15:29:39 188浏览量 回答数 1

1

回答

通称为TCP/IP协议族是什么?

2021-12-02 18:48:41 185浏览量 回答数 1

1

回答

TCP/IP 协议 协议族具体是什么意思?

2021-12-02 19:25:21 167浏览量 回答数 1

1

回答

TCP/IP 是基于哪两个最初的协议之上的不同的通信协议的大集合?

2021-12-02 17:40:29 360浏览量 回答数 1

1

回答

当您写邮件时,您会用到 TCP/IP协议吗?

2021-12-02 18:34:00 258浏览量 回答数 1

1

回答

在 TCP/IP 体系结构中,网络层使用 什么协议?

2021-12-02 18:46:15 209浏览量 回答数 1

1

回答

在 TCP/IP 中包含一系列用于什么的协议?

2021-12-01 12:53:35 347浏览量 回答数 1

1

回答

 TCP/IP 中包含了哪些用于处理数据通信的协议?

2021-12-01 12:57:20 376浏览量 回答数 1

1

回答

TCP/IP协议属不属于应用层呢?

2021-11-15 21:38:33 254浏览量 回答数 1

1

回答

TCP/IP协议族包括什么?

2021-11-02 22:25:47 188浏览量 回答数 1
+关注
杨冬芳
IT从业
文章
问答
问答排行榜
最热
最新
相关电子书
更多
ECS系统指南之Linux系统诊断
立即下载
亿级场景化的实时音视频通讯服务
立即下载
从 Linux 系统内核层面来解决实际问题的实战经验
立即下载