c - 无法通过 C 中的套接字通过写入和读取函数发送 char 数组

标签 c sockets blocking

我正在编写一组客户端/服务器程序,旨在通过本地网络获取文件信息。我试图允许客户端定义路径并将其发送到服务器,但是我的服务器读取函数不断返回负值,这意味着错误。我什至尝试对我发送的字节数进行硬编码,以便可能排除阻塞问题。任何帮助表示赞赏。

服务器 #包括 #包括 #包括 #包括 #包括 #包括 #包括 #包括

#define DEFAULT_PROTOCOL 0

char* path;

main()
{
    int serverFd, clientFd, serverLen, clientLen;
    struct sockaddr_un serverAddress;
    struct sockaddr_un clientAddress;
    struct sockaddr* serverSockAddrPtr;
    struct sockaddr* clientSockAddrPtr;

    signal(SIGCHLD, SIG_IGN);

    serverSockAddrPtr = (struct sockaddr*) &serverAddress;
    serverLen = sizeof(serverAddress);

    clientSockAddrPtr = (struct sockaddr*) &clientAddress;
    clientLen = sizeof(clientAddress);

    serverFd = socket(PF_LOCAL, SOCK_STREAM, DEFAULT_PROTOCOL);
    serverAddress.sun_family = PF_LOCAL;
    strcpy (serverAddress.sun_path, "recipe");
    unlink ("recipe");
    bind (serverFd, serverSockAddrPtr, serverLen);
    listen (serverFd, 5);

    while(1)
    {
        clientFd = accept (serverFd, clientSockAddrPtr, &clientLen);

        if (fork() == 0)
        {

            int n = read(clientFd, path, 7);
            printf("%d\n", n);
            printf("Path is %s\n", path);
            writeRecipe(clientFd);
            close (clientFd);
            exit(0);

        } else {
            close (clientFd);
        }

    }
}

writeRecipe(fd)

int fd;

{

    static char str[80];

    DIR *dir;
    struct dirent *ent;
    struct stat fileStat;
    if ((dir = opendir (path)) != NULL) {
      while ((ent = readdir (dir)) != NULL) {

        if(stat(ent->d_name,&fileStat) < 0)    
            printf("fail");
        sprintf(str, "Inode: %d |Link Count: %d   |File Size: %d |Modified: %d\n",fileStat.st_ino, fileStat.st_nlink, fileStat.st_size, fileStat.st_mtime );
        write(fd, str, strlen(str) + 1);
      }
      closedir (dir);
    } else {
      /* could not open directory */
        printf("fail");
    }

}

客户端

#include <stdio.h>
#include <signal.h>
#include <sys/types.h>
#include <linux/limits.h>
#include <sys/socket.h>
#include <sys/un.h>

#define DEFAULT_PROTOCOL 0

main (int argc, char* argv[] )

{
    char* path;
    if (argc > 1) {
        path = argv[1];
    } else {
        path = ".";
    }
    printf("Path is %s\n", path);
    int clientFd, serverLen, result;
    struct sockaddr_un serverAddress;
    struct sockaddr* serverSockAddrPtr;

    serverSockAddrPtr = (struct sockaddr*) &serverAddress;
    serverLen = sizeof(serverAddress);

    clientFd = socket (PF_LOCAL, SOCK_STREAM, DEFAULT_PROTOCOL);
    serverAddress.sun_family = PF_LOCAL;
    strcpy (serverAddress.sun_path, "recipe");

    do
        {
            result = connect(clientFd, serverSockAddrPtr, serverLen);
            if (result == -1) sleep (1);
        }
    while (result == -1);
    int n = write(clientFd, path, strlen(path));
    printf("%d\n", n);
    readRecipe (clientFd);
    close (clientFd);
    exit(0);
}

readRecipe(fd)

int fd;

{
    char str[200];
    while (readLine(fd, str))
        printf("%s\n", str);


}

readLine(fd, str)

int fd;
char* str;

{
    int n;

    do
        {
            n = read (fd, str, 1);
        }
    while (n > 0 && *str++ != 0);
    return (n > 0);

}

返回值为负1,errno为14。

最佳答案

由于邪恶的奥托,分配内存是问题所在。我将服务器代码从 char* 更改为分配了内存的 char,所有问题都解决了。

关于c - 无法通过 C 中的套接字通过写入和读取函数发送 char 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20336510/

相关文章:

php - 处理具有前导长度值的套接字数据

c - 如何打开具有两个不同端口的 UDP 套接字?

javascript - 是否可以允许在javascript的主线程中等待

events - 非阻塞(事件驱动 I/O)与阻塞 I/O

c - Perl 中有实数 vector (一维数组)吗?

c - 微 Controller 编程要学什么语言?

c - popen:拦截用户的输入

c++ - 如何将 Char 转换为 Float

java - 从 Tomcat : No buffer space available 发送 SMTP 消息时出错

android - Android 2.3 中的调用阻止