附件里是我的操作的一个截屏
现实是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 (快刀) 的大作中提到: 】
: 我看问题在你没贴出的程序里,照理说这么断程序可能是不需要信号处理也能运行好的。