Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法通过C中的套接字通过写和读函数发送字符数组_C_Sockets_Blocking - Fatal编程技术网

无法通过C中的套接字通过写和读函数发送字符数组

无法通过C中的套接字通过写和读函数发送字符数组,c,sockets,blocking,C,Sockets,Blocking,我正在编写一组客户机/服务器程序,用于通过本地网络获取文件信息。我试图允许客户端定义路径并将其发送到服务器,但是我的服务器读取函数不断返回负值,这意味着错误。我甚至尝试对发送的字节数进行硬编码,以排除阻塞问题。感谢您的帮助 服务器 #包括 #包括 #包括 #包括 #包括 #包括 #包括 #包括 #define DEFAULT_PROTOCOL 0 char* path; main() { int serverFd, clientFd, serverLen, clientLen;

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

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

#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");
    }

}
#定义默认_协议0
字符*路径;
main()
{
int serverFd、clientFd、serverLen、clientLen;
结构sockaddr_un serverAddress;
结构sockaddr_un clientAddress;
结构sockaddr*serverSockAddrPtr;
结构sockaddr*clientSockAddrPtr;
信号(信号灯、信号灯);
serverSockAddrPtr=(结构sockaddr*)&serverAddress;
serverLen=sizeof(服务器地址);
clientSockAddrPtr=(结构sockaddr*)&clientAddress;
clientLen=sizeof(clientAddress);
serverFd=socket(PF_本地、SOCK_流、默认_协议);
serverAddress.sun_family=PF_LOCAL;
strcpy(serverAddress.sun_路径,“配方”);
取消链接(“配方”);
绑定(serverFd、serverSockAddrPtr、serverLen);
听(5);
而(1)
{
clientFd=accept(serverFd、clientSockAddrPtr和clientLen);
如果(fork()==0)
{
int n=读取(clientFd,路径,7);
printf(“%d\n”,n);
printf(“路径是%s\n”,路径);
书面委托(客户FD);
关闭(clientFd);
出口(0);
}否则{
关闭(clientFd);
}
}
}
写入密码(fd)
int-fd;
{
静态字符str[80];
DIR*DIR;
结构导向;
struct stat fileStat;
如果((dir=opendir(path))!=NULL){
while((ent=readdir(dir))!=NULL){
if(stat(ent->d_name,&fileStat)<0)
printf(“失败”);
sprintf(str,“Inode:%d |链接计数:%d |文件大小:%d |修改:%d\n”,fileStat.st|ino,fileStat.st|nlink,fileStat.st|Size,fileStat.st|mtime);
写(fd,str,strlen(str)+1);
}
closedir(dir);
}否则{
/*无法打开目录*/
printf(“失败”);
}
}
客户

#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);

}
#包括
#包括
#包括
#包括
#包括
#包括
#定义默认的\u协议0
main(int argc,char*argv[])
{
字符*路径;
如果(argc>1){
path=argv[1];
}否则{
path=“.”;
}
printf(“路径是%s\n”,路径);
int clientFd、serverLen、result;
结构sockaddr_un serverAddress;
结构sockaddr*serverSockAddrPtr;
serverSockAddrPtr=(结构sockaddr*)&serverAddress;
serverLen=sizeof(服务器地址);
clientFd=socket(PF_本地、SOCK_流、默认_协议);
serverAddress.sun_family=PF_LOCAL;
strcpy(serverAddress.sun_路径,“配方”);
做
{
结果=连接(clientFd、serverSockAddrPtr、serverLen);
如果(结果==-1)睡眠(1);
}
而(结果==-1);
int n=写入(clientFd,path,strlen(path));
printf(“%d\n”,n);
readRecipe(clientFd);
关闭(clientFd);
出口(0);
}
阅读配方(fd)
int-fd;
{
char-str[200];
while(读线(fd,str))
printf(“%s\n”,str);
}
读线(fd、str)
int-fd;
char*str;
{
int n;
做
{
n=读取(fd,str,1);
}
而(n>0&&*str++!=0);
返回(n>0);
}

返回的值为负1,错误号为14。

多亏了邪恶的奥托,分配内存才是问题所在。我将服务器代码从char*更改为具有已分配内存的char,所有问题都得到解决。

当read()返回负值时,errno是什么?您是否为read分配了内存以供读取?