c - 传输端点未连接 recv 套接字

标签 c sockets unix

我编写了一个简单的程序,可以将字符串从小写更改为大写,然后从大写更改为小写。 服务器一直工作到启动客户端,客户端运行服务器后出现此错误: “接收服务器 fallita:传输端点未连接” 为什么?我认为那条流关闭得太快了? 下面是服务器代码:

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <ctype.h>
#include <sys/socket.h>
#include <string.h>
#include <netinet/in.h>
#define MAXLENGTH 80
#define SERVERPORT 1313


void minuscolatore (int in,int out){
    char inputline[MAXLENGTH];
    int len,i;
    while((len=recv(in,inputline,MAXLENGTH,0))>0){
        for(i=0;i<len;i++){
            inputline[i]=tolower(inputline[i]);
        }
        if (strcmp(inputline,"fine")==0){
            break;
        }
        send(out,inputline,len,0);
    }
}
void maiuscolatore(int in,int out){
    char inputline[MAXLENGTH];
    int len,i;
    while((len=recv(in,inputline,MAXLENGTH,0))>0){
        for(i=0;i<len;i++){
            inputline[i]=toupper(inputline[i]);
        }
        if (strcmp(inputline,"FINE")==0){
            break;
        }
        send(out,inputline,len,0);
    }
}
int main(){
    int sock,client_len,fd;
    char c;
    struct sockaddr_in client, server = {AF_INET,htons(SERVERPORT),INADDR_ANY};
    if((sock=socket(AF_INET,SOCK_STREAM,0))==-1){
        perror("Socket fallita");
        exit(1);
    }
    if(bind(sock,(struct sockaddr *)&server,sizeof server)==-1){
        perror("Bind fallita");
        exit(2);
    }
    listen(sock,5);
    while(1){
        client_len=sizeof(client);
        if((fd=accept(sock,(struct sockaddr *)&client,&client_len))<0){
            perror("accept fallita");
            exit(3);
        }
        if (recv(sock,&c,1,0)==-1){
            perror("recv server fallita");
            exit(4);
        }
        if (c=='+'){
        switch(fork()){
            case -1:
                perror("Fork fallita");
                exit(4);
            case 0:
                printf("Aperta connessione\n");
                send(fd,"Benvenuto al maiuscolatore, minuscolatore\n",27,0);
                maiuscolatore(fd,fd);
                printf("Chiusa connessione\n");
        }
    }
        else if (c=='-'){
        switch(fork()){
            case -1:
                perror("Fork fallita");
                exit(4);
            case 0:
                printf("Aperta connessione\n");
                send(fd,"Benvenuto al maiuscolatore, minuscolatore\n",27,0);
                minuscolatore(fd,fd);
                printf("Chiusa connessione\n");
        }   
        }
    }
    close(fd);
}

和客户之后:

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <ctype.h>
#include <sys/socket.h>
#include <string.h>
#include <netinet/in.h>
#define MAXLENGTH 80
#define SERVERPORT 1313

int main(){
    int sockfd;
    struct sockaddr_in server={AF_INET,htons(SERVERPORT),INADDR_ANY};
    int i=0, len;
    char buf[MAXLENGTH],c,d;
    if ((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1){
        perror("socket fallita");
        exit(1);
    }
    if (connect(sockfd, (struct sockaddr *) &server,sizeof server)==-1){
        perror("connect fallita");
        exit(2);
    }
    printf("\nDigita una stringa :");
    while((c=getchar())!='\n' && i<MAXLENGTH)
        buf[i++]=c;

    buf[i]='\0';
    len=strlen(buf);
    printf("\nScrivi + se vuoi tutto maiuscolo e - se vuoi tutto minuscolo:");
    d=getchar();
    if (send(sockfd,&d,1,0)==-1){
        perror("send d fallita");
        exit(4);
    }
    printf("\nInvio la stringa al server...\n");
    if(send(sockfd,buf,len,0)==-1){
        perror("send fallita");
        exit(4);
    }
    if(recv(sockfd,buf,len,0)>0){
        printf("Ho ricevuto la risposta: %s\n",buf);
    }
    else{
        perror("seconda receive fallita");
        exit(3);
    }
    close(sockfd);
    exit(0);
}

最佳答案

accept 中的 fdrecv 的文件句柄,而不是 sock

关于c - 传输端点未连接 recv 套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8760701/

相关文章:

python - 如何一次向 Tornado 套接字客户端广播消息?

java - 发送紧急数据后 TCP 连接被重置

c++ - 在大于 unsigned long long 的数字上中断循环

c - 在无限棋盘上,骑士从 xb、yb 到 xe、ye 可以走的路线数

c - 十六进制颜色代码到 RGB 数字

c - 解释器文件的主要用途是什么?

linux - 提取 cpio.gz 里面有两个文件

c - gcc 在我制作的静态库中找不到头文件

c++ - 序列化优于 sockets c++ 的优势

c - 程序堆内存的初始大小