在问我的问题之前,让我告诉大家我是网络编程领域的新手,所以请原谅我的错误并提出改进的方法。先感谢您!
对于我的网络编程课上的作业,我们的教授希望我们编写一个使用 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;
}
我只想在客户端上有用户输入的情况下才将数据发送到服务器,如果有来自服务器的任何数据,我想在客户端上显示。现在,从服务器获取数据一次后,它挂起。终止向/从服务器发送和接收数据的最佳条件是什么?