c - C服务器运行但没有输出
问题描述
关于SO的第一个问题。不是英语本地人,所以可能会犯一些错误,我的评论是意大利语。目前我的 C 服务器实现有问题。代码运行没有错误,但是当我执行它时,它什么也没显示。我试图分解代码并放置一些打印以显示它“阻塞”但无法得出结论。这是代码:
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
struct sockaddr_in address;
struct sockaddr_in local;
//definisco la struttura per gli header composta dal nome e dal valore
struct header {
char * nome;
char * valore;
};
struct header h[100];
int main() {
printf("qui");
int s; //istanza del socket
int newS; //istanza del socket del server
int newS2; //socket per la connessione al client
int site; //istanza file ricevuti
int conn_max = 10; //istnza connessionni massime server
char request[1000]; //istanza della response
int primiduepunti = 0;
int sin_size = 0;
int j = 0; //contatore
int i = 0; //contatore
s = socket(AF_INET, SOCK_STREAM, 0); //creazione socket
//Configurazione indirizzo IP locale
((char *)&local.sin_addr)[0] = 127;
((char *)&local.sin_addr)[1] = 0;
((char *)&local.sin_addr)[2] = 0;
((char *)&local.sin_addr)[3] = 1;
local.sin_family = AF_INET;
local.sin_port = htons(1050);
newS = bind(s, (struct sockaddr*)&local, sizeof(struct sockaddr_in)); //assegna un indirizzo locale ad un socket
if( newS == -1) {
perror("Bind fallita");
return 1;
}
newS = listen(s, conn_max); //metto in ascolto il nostro server
while(1) {
sin_size = sizeof(struct sockaddr_in);
printf("qua");
newS2 = accept(s,(struct sockaddr*)&local, &sin_size); //Crea un nuovo socket che è connesso al client
printf("Accettata connessione con client \n");
fflush(stdout);
if(fork == 0) {
if(newS2 == -1) {
perror("Accept fallita");
return 1;
}
}
h[0].nome = request;
h[0].valore = h[0].nome;
//ciclo per riempire gli header; read ritorna il numero di elementi letti
for(i = 0, j = 0; (newS = read(newS2, request+i, 1)) >0; i++) {
if((i>1) && (request[i] == '\r') && (request[i+1] == '\n')) {
primiduepunti = 1;
request[i] = 0;
if(h[j].nome[0] == 0) break;
h[++j].nome = request+i+2;
}
if(primiduepunti && j>0 && request[i] == ':') {
primiduepunti = 0;
h[j].valore = request+i+1;
request[i] = 0;
}
}
for(int i=1; i<j; i++) {
printf("%s ---> %s \n", h[i].nome, h[i].valore);
}
}
}
感谢所有的帮助!
解决方案
一些逻辑问题,看:
while(1) {
sin_size = sizeof(struct sockaddr_in);
printf("qua");
newS2 = accept(s,(struct sockaddr*)&local, &sin_size);
printf("Accettata connessione con client \n");
fflush(stdout);
if(fork == 0) {
if(newS2 == -1) {
perror("Accept fallita");
return 1;
}
}
}
无论您返回accept
或退出发生什么,都没有条件可以让您退出循环来阅读某些内容。return 1
只是从程序返回main
并退出。
注意:我想fork
是对 的调用fork()
,但即使在那种情况下,问题也是一样的......
像这样的东西应该更好:
while(1) {
sin_size = sizeof(struct sockaddr_in);
newS2 = accept(s,(struct sockaddr*)&local, &sin_size);
if(newS2 == -1) {
perror("Accept fallita");
return 1;
}
printf("Accettata connessione con client \n");
fflush(stdout);
if(fork() == 0) {
break; // get out the loop...
}
}
推荐阅读
- r - 在 R 的 Plantecophys 包中使用 fitacis 绘制多条曲线的问题
- amazon-s3 - 在 Linux 上的 azure devops 管道中运行的 S3 同步问题
- elasticsearch - 如何在过滤器(术语)查询中添加多个字段以模拟 ElasticSearch 中的 OR
- c - 如何从 C 中的用户输入正确读取文件?
- laravel - 完整性约束违规:1452 无法添加或更新子行:外键约束失败
- database - 如何在列可能随每个新行更改的上下文中设计数据库表
- python - Webbots Python3“ModuleNotFound”错误MacOS
- tfs - 我们如何在门控签入期间获取搁置集名称并将其分配给 tfs 构建任务中的变量
- visual-studio - Visual Studio 2019 声称我的解决方案中的大多数 SSAS 项目都是“不兼容的”
- google-cloud-platform - Pyspark:将 csv 写入 Google Cloud Storage