来自菜鸟的悲伤 2021-06-07 14:53 采纳率: 50%
浏览 149

写的域套接字文件通信,recv函数出现Invalid argument

//服务器端的
#include<stdio.h>
#include<stdlib.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<sys/un.h>
#include<strings.h>
#include<pthread.h>
#include<arpa/inet.h>
#include<string.h>
#include<signal.h>

typedef struct data
{
	char buff[100];
}Data;

void *pth_fun(void *pth_argv)
{
	int sockfd = -1;
	Data her_data = {0};
	sockfd = socket(PF_UNIX,SOCK_STREAM,0);
	if(sockfd == -1)
	{
		perror("socket");
		exit(-1);
	}
	while(1)
	{
		if(-1 == recv(sockfd,(void *)&her_data,sizeof(her_data),0))
		{
			perror("recv");
			exit(-1);
		}
		printf("%s\n",her_data.buff);
	}

}

void sigrm(int signum)
{
	if(SIGINT == signum)
	{	
		remove("./UNIX_SOCK");
		exit(-1);
	}
}

int main(int argc,char **argv)
{
	int sockfd = -1;
	int fd = -1;
	signal(SIGINT,sigrm);
	sockfd = socket(PF_UNIX,SOCK_STREAM,0);
	if(sockfd == -1)
	{
		perror("socket");
		return 0;
	}
	struct sockaddr_un my_addr = {0};
	my_addr.sun_family = PF_UNIX;
	strcpy(my_addr.sun_path,"./UNIX_SOCK");
	if(-1 == bind(sockfd,(struct sockaddr *)&my_addr,sizeof(my_addr)))
	{
		perror("bind");
		exit(-1);
	}
	if(-1 == listen(sockfd,3))
	{
		perror("listen");
		exit(-1);
	}
	fd = accept(sockfd,NULL,0);
	if(fd == -1)
	{
		perror("accept");
		exit(-1);
	}
	pthread_t pid;
	if(-1 == pthread_create(&pid,NULL,pth_fun,NULL))
	{
		perror("pthread_create");
		exit(-1);
	}
	Data my_data = {0};
	while(1)
	{
		scanf("%s",my_data.buff);
		if(send(fd,(void *)&my_data,sizeof(my_data),0))
		{
			perror("send");
			exit(-1);
		}
	}
	return 0;
}





//客户端的代码
#include<stdio.h>
#include<stdlib.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<sys/un.h>
#include<pthread.h>
#include<arpa/inet.h>
#include<signal.h>
#include<string.h>

typedef struct data
{
	char buff[100];
}Data;

void *pth_fun(void *pth_argv)
{
	int sockfd = -1;
	sockfd = socket(AF_UNIX,SOCK_STREAM,0);
	if(sockfd == -1)
	{
		perror("socket");
		exit(-1);
	}
	Data her_data = {0};
	while(1)
	{
		if(-1 == recv(sockfd,(void *)&her_data,sizeof(her_data),0))
		{
			perror("recv");
			exit(-1);
		}
		printf("%s\n",her_data.buff);
	}
}
void sigram(int signum)
{
	if(signum == SIGINT)
	{
		remove("./UNIX_SOCK");
		exit(-1);
	}
}
int main(int argc,char **argv)
{
	int sockfd = -1;
	struct sockaddr_un seraddr={0};
	signal(SIGINT,sigram);
	sockfd = socket(AF_UNIX,SOCK_STREAM,0);
	if(sockfd == -1)
	{
		perror("socket");
		exit(-1);
	}
	Data my_data = {0};
	seraddr.sun_family = AF_UNIX;
	strcpy(seraddr.sun_path,"./UNIX_SOCK");
	if(-1 == connect(sockfd,(struct sockaddr *)&seraddr,sizeof(seraddr)))
	{
		perror("connect");
		exit(-1);
	}
	pthread_t pid;
	pthread_create(&pid,NULL,pth_fun,NULL);
	while(1)
	{
		scanf("%s",my_data.buff);
		if(-1 == send(sockfd,(void *)&my_data,sizeof(my_data),0))
		{
			perror("send");
			exit(-1);
		}
	}

	return 0;
}




  • 写回答

2条回答 默认 最新

  • lshen01 2023-03-17 12:30
    关注

    参考GPT和自己的思路:

    根据代码可以看出,服务器端的recv函数出现了Invalid argument的问题,这个错误通常是由于传递给recv函数的某些参数不正确导致的。

    具体来说,程序中使用的是UNIX域套接字通信,因此在使用recv函数的时候,需要注意以下几个问题:

    1. 参数sockfd应该是服务器端的套接字描述符,而不是客户端的套接字描述符;

    2. 参数buf应该是一个指向接收数据缓冲区的指针,而不是一个指向Data结构体的指针;

    3. 参数len应该是接收缓冲区的大小,而不是Data结构体的大小。

    另外,从代码中可以看出,服务器端的套接字描述符是通过socket函数创建的,而客户端的套接字描述符是通过connect函数创建的,这两个函数中使用的地址族不同,建议在客户端和服务器端中使用相同的地址族。

    通过排查以上几个问题,应该可以解决recv函数出现Invalid argument的问题。

    评论

报告相同问题?

悬赏问题

  • ¥15 16进制修改视频的元数据
  • ¥15 思科模拟器Router c3600 NM-4E
  • ¥15 岛津txt格式文件转nirs格式
  • ¥15 石墨烯磁表面等离子体
  • ¥15 angular 项目无法启动
  • ¥15 安装wampserver,图标绿色,但是无法进入软件
  • ¥15 C++ MFC 标准库 加密解密解惑
  • ¥15 两条数据合并成一条数据
  • ¥15 Ubuntu虚拟机设置
  • ¥15 comsol三维模型中磁场为什么没有“速度(洛伦兹项)”这一选项