在 C 中写入套接字会导致“程序退出,代码为 141”

tes*_*ter 2 c sockets

我正在尝试在 C 中设置客户端/服务器。我建立连接,然后我想向服务器发送用户名和密码,服务器必须回复确认他已收到 usr/pwd。问题是服务器和客户端一遇到“写”或“读”功能就退出。我应该怎么办?

服务器.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <netdb.h>
#include <signal.h>

void main(){
   int ds_sock;
   struct sockaddr_in my_addr;
   ds_sock=socket(AF_INET,SOCK_STREAM,0);

   memset(&my_addr,0,sizeof(my_addr));
   my_addr.sin_family=AF_INET;
   my_addr.sin_port=htons(25000);
   my_addr.sin_addr.s_addr=INADDR_ANY;

   if(bind(ds_sock,(struct sockaddr *)&my_addr,sizeof(my_addr))<0){
       printf("error in bind");
   }

   listen(ds_sock,2);
   int ds_sock_acc;
   struct sockaddr_in addr;
   size_t sin_size = sizeof(struct sockaddr_in);
   signal(SIGCHLD,SIG_IGN);
   while(1){
       if((ds_sock_acc=accept(ds_sock,(struct sockaddr *)&addr,&sin_size))<1){
           printf("error accept");
       }
    printf("connected");
    char usr[10];
    read(ds_sock,usr,10);
    char* confirm_usr;
    confirm_usr="Username received";
    write(ds_sock,confirm_usr,100);

    char pwd[10];
    read(ds_sock,pwd,10);
    char* confirm_pwd;
    confirm_pwd="Password received";
    write(ds_sock,confirm_pwd,100);
   }    
}
Run Code Online (Sandbox Code Playgroud)

客户端.c:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <netdb.h>

void main(){
    int ds_sock;
    ds_sock = socket(AF_INET, SOCK_STREAM,0);

    int ret;
    struct sockaddr_in Eaddr;
    Eaddr.sin_family = AF_INET;
    Eaddr.sin_port = htons(25000);
    Eaddr.sin_addr.s_addr=inet_addr("127.0.0.1");
    ret = connect(ds_sock,(struct sockaddr *)&Eaddr,sizeof(Eaddr));
    if(ret==-1){ 
        printf("error connect");
        exit(EXIT_FAILURE);
    }
    printf("connect OK");

    char usr[10];
    printf("Insert username");
    scanf("%s",usr);

    char pwd[12];
    printf("Insert password");
    scanf("%s",pwd);
    printf("%s",pwd);

    write(ds_sock,usr,10);  
    char usr_reply[100];
    read(ds_sock,usr_reply,100);
    printf("%s",usr_reply);

    write(ds_sock,pwd,12);
    char pwd_reply[100];
    read(ds_sock,pwd_reply,100);
    printf("%s",pwd_reply);
}
Run Code Online (Sandbox Code Playgroud)

toz*_*han 5

虽然第一个答案非常完整,但我想添加 141 错误是 SIGPIPE 错误。(在linux手册中查看这一点)您可以strace您的程序来查找错误代码或实现errno和perror。