//服务器端的
#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;
}
写的域套接字文件通信,recv函数出现Invalid argument
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
2条回答 默认 最新
- lshen01 2023-03-17 12:30关注
参考GPT和自己的思路:
根据代码可以看出,服务器端的recv函数出现了Invalid argument的问题,这个错误通常是由于传递给recv函数的某些参数不正确导致的。
具体来说,程序中使用的是UNIX域套接字通信,因此在使用recv函数的时候,需要注意以下几个问题:
参数sockfd应该是服务器端的套接字描述符,而不是客户端的套接字描述符;
参数buf应该是一个指向接收数据缓冲区的指针,而不是一个指向Data结构体的指针;
参数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三维模型中磁场为什么没有“速度(洛伦兹项)”这一选项