gpt4 book ai didi

c - 简单的 TCP 服务器

转载 作者:行者123 更新时间:2023-12-02 22:13:14 27 4
gpt4 key购买 nike

这是用于教学目的的基本 TCP 服务器实现。是否有任何错误或需要改进的地方。欢迎任何建议!

我只有一个疑问:

signal(SIGCHLD, SIG_IGN);

该调用是否用于防止 zoombie-child 进程?

 #include <netinet/in.h>
#include <sys/socket.h>
#include <netdb.h>

#include <sys/signal.h>

#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#define BACKLOG 5
#define MAXSIZE 1024 //max-bytes for read-buffer

void main(){

int sock_ds, ret, length;
int acc_ds; //Accept socket descriptor

struct sockaddr_in addr; //this addres
struct sockaddr rem_addr; //remote address (generic)

char buff[MAXSIZE];

sock_ds = socket(AF_INET, SOCK_STREAM, 0); // => TCP

bzero((char *)&addr, sizeof(addr)); //reset struct
addr.sin_family = AF_INET;
addr.sin_port = htons(25000);
addr.sin_addr.s_addr = INADDR_ANY;
ret = bind(sock_ds, &addr, sizeof(addr));
if(ret == -1){
perror("Binding error");
exit(1);
}

ret = listen(sock_ds, BACKLOG); // backlog queue
if(ret == -1){
perror("Listen error");
exit(1);
}

length = sizeof(rem_addr);
signal(SIGCHLD, SIG_IGN); //zombie children management

/*Busy-waiting (server) and concurrency */
while(1){

/*Repeat until success*/
while(acc_ds = accept(sock_ds, &rem_addr, &length) == -1){

if(fork() == 0){ //child-process

close(sock_ds); //unused from child
do{
read(acc_ds, buff, MAXSIZE);
printf("Message from remote host:&s\n", buff);

}while(strcmp(buff, "quit") == 0);
/*Transimission completed: server response */
write(acc_ds, "Reading Done", 10);
close(acc_ds); //socket closed
exit(0); //exiting from child
}
else{
close(acc_ds); //unused from parent
}
}
}

最佳答案

  1. main 的返回类型不是int。它应该是。返回 EXIT_SUCCESSEXIT_FAILURE
  2. 未检查 socket() 调用的结果。它应该是,否则 bind 会失败,但 perror() 会告诉“无效参数”而不是实际错误。
  3. 未检查 read() 的返回值,可能会在打印时触发未定义的行为。
  4. 没有指定&s格式,应该是%s
  5. %s 需要一个以 null 结尾的字符串。代码不能保证这一点(请参阅第 3 点)。 strcmp() 也可能出错。

至于SIGCHLD,@cnicutar 已经友善地回答了,没有什么可以补充的。

希望对您有所帮助。祝你好运!

关于c - 简单的 TCP 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14915988/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com