1

在问我的问题之前,让我告诉大家我是网络编程领域的新手,所以请原谅我的错误并提出改进的方法。先感谢您!

对于我的网络编程课上的作业,我们的教授希望我们编写一个使用 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;
}

我只想在客户端上有用户输入的情况下才将数据发送到服务器,如果有来自服务器的任何数据,我想在客户端上显示。现在,从服务器获取数据一次后,它挂起。终止向/从服务器发送和接收数据的最佳条件是什么?

4

1 回答 1

0

对于确保仅在读取后发生写入的部分,一种方法是使用。

wait(NULL);

是父进程用来等待子进程终止的调用。在此之后执行的任何代码都保证在 child 终止后运行。

也许你应该颠倒你的顺序,即父母应该写作,孩子应该阅读。

但是,这意味着您的所有写入都在客户端完成读取并终止后完成。

如果你想读一整行,写然后再读一遍,上面不是路要走。

于 2012-10-02T12:23:10.647 回答