linux后台 无法echo,一个简单的echo client,一放后台就进程中止了

本文提供了一个使用C++实现的简单网络客户端程序示例,该程序可以与回显服务器进行交互。通过分析代码,读者可以了解如何利用标准库进行网络通信的基本流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

df5a71549a348a26d5515a35db570734

附件里是我的操作的一个截屏

现实是ctrl z 没问题,查看jobs后,是stoped状态,但一 bg,再jobs,就发现done了

代码如下:

//

//  main.cpp

//  echo-client

//

//  Created by Haochi Wu on 5/13/13.

//  Copyright (c) 2013 MyOrganizationName. All rights reserved.

//

#include 

#include "unp.h"

#include 

#include 

#include "netinet/in.h"

#include "arpa/inet.h"

using namespace std;

void str_cli(FILE* fp, int sockfd)

{

char sendline[MAXLINE], recvline[MAXLINE];

while(fgets(sendline, MAXLINE, fp) != NULL)

{

int sendlen = strlen(sendline);

int nwrite = 0;

while (nwrite 

int n = write(sockfd, sendline + nwrite, sendlen - nwrite);

if( n <= 0)

{

if (n 

n = 0;

}

else{

break; // fail to write out, give up

}

}

nwrite += n;

}

if(nwrite == sendlen)

{

// write to socket ok

}

else{

cerr <

}

ssize_t n = read(sockfd, recvline, MAXLINE);//it's incorrect, but for small packet size,

// i believe it can be read in one call

if (n > 0) {

recvline[n] = 0;

cout <

cout.flush();

}

}

}

int main(int argc, const char * argv[])

{

cout <

if( argc <= 1)

{

cerr <

exit(0);

}

int connfd;

sockaddr_in servaddr, cliaddr;

socklen_t serv_len, cli_len;

serv_len = cli_len = sizeof(sockaddr_in);

int fcode = 0;

servaddr.sin_family = AF_INET;

if(argc == 2)

{

servaddr.sin_port = htons(ECHO_SERVER_PORT);

}

else if (argc ==3)

{

servaddr.sin_port = htons(atoi(argv[2]));

}

fcode =  inet_pton(AF_INET, argv[1], &servaddr.sin_addr.s_addr);

if(fcode == 0)

{

cerr <

return 0;

}

else if(fcode == -1){

err_quit("inet_pton error: %s", strerror(errno));

}

connfd = socket(AF_INET, SOCK_STREAM, 0);

if(connfd <= 0)

{

err_quit("create socket fail: %s", strerror(errno));

}

fcode = connect(connfd, SA(&servaddr), serv_len);

if( fcode == EINTR)

{

cout <

return 0;

}

getsockname(connfd, SA(&cliaddr), &cli_len);

const socklen_t cliaddr_buflen = 1024;

char cliaddr_buf[cliaddr_buflen];

if( NULL == inet_ntop(AF_INET, &cliaddr.sin_addr.s_addr, cliaddr_buf, cliaddr_buflen))

{

err_quit("inet_ntop error: %s", strerror(errno));

}

cout <

str_cli(stdin, connfd);

exit(0);

return 0;

}

【 在 Distance (快刀) 的大作中提到: 】

: 我看问题在你没贴出的程序里,照理说这么断程序可能是不需要信号处理也能运行好的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值