在询问我的问题之前,让我告诉大家我是网络编程领域的新手所以请原谅我的错误并提出改进方法。提前谢谢!
对于我的网络编程课程中的作业,我们的教授希望我们编写一个使用fork()的客户端程序,即
pid = fork();
if (pid == 0) // child
Send();
else //parent
Recv();
我正在尝试的代码如下,
#include <cstdlib>
#include <stdio.h>
#include <error.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <string.h>
#include <unistd.h>
#define SERVER_PORT_NUM "10060"
#define MAX_BYTES 2000
using namespace std;
int main(int argc, char** argv) {
int status;
struct addrinfo hints;
struct addrinfo *servinfo;
char buf[MAX_BYTES];
memset(&hints, 0, sizeof(hints));
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
hints.ai_flags = AI_PASSIVE;
if ( (status = getaddrinfo("localhost", SERVER_PORT_NUM, &hints, &servinfo)) != 0) {
fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(status));
return 2;
}
int s;
if ((s = socket(servinfo->ai_family, servinfo->ai_socktype, servinfo->ai_protocol)) == -1) {
fprintf(stderr, "socket: %s\n", gai_strerror(s));
return 2;
}
if (connect(s, servinfo->ai_addr, servinfo->ai_addrlen) == -1) {
close(s);
}
freeaddrinfo(servinfo);
char ch='\0';
pid_t pid = fork();
if (pid == 0) {// child process
while(1){
memset(&buf, 0, sizeof(buf));
scanf("%s",buf);
send(s,buf,strlen(buf),0);
}
}//pid==0
else { //parent process
int numbytes=0;
memset(&buf, 0, sizeof(buf));
while(1) {
if((numbytes= recv(s, &buf, MAX_BYTES-1, 0)) >0) {
printf("\n%s", buf);
memset(&buf, 0, numbytes);
}
if(numbytes < 0) {
printf("Error receiving data");
}
}
}
close(s);
return 0;
}
我想仅在客户端终端上有来自用户的输入时才将数据发送到服务器,如果有来自服务器的数据则显示在客户端终端上。现在,从服务器获取一次数据后它就会挂起。终止向/从服务器发送和接收数据的最佳条件是什么?
答案 0 :(得分:0)
对于确保只在读取后进行写入的部分,一种方法是使用。
wait(NULL);
是父级用于等待子进程终止的调用。在此之后执行的任何代码都保证在子节点终止后运行。
也许你应该改变你的命令,即父母应该写作,孩子应该阅读。
但是,这意味着您的所有写入都是在客户端完成读取并终止后完成的。
如果你想阅读一个完整的行,那么再写一次,再回到阅读,上面就不是了。