无法通过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分配了内存以供读取?