linux c 多进程的服务器客户端 socket operation on non-socket

时间:2021-08-08 00:05:41
server.c:
#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<sys/un.h>
#include<netinet/in.h>
#include<unistd.h>
#include<stdlib.h>
#include<signal.h>
#include<string.h>
#include <sys/stat.h>
#include <fcntl.h>

int main()
{
int client_sockfd,server_sockfd;
pid_t pid;
int client_len,server_len;
struct sockaddr_in client_add,server_add;

if((server_sockfd = socket(AF_INET,SOCK_STREAM,0)) == -1){ //创建服务端socket
perror ("socket create fail");
         exit (EXIT_FAILURE);
}
bzero(&server_add,sizeof(server_add));
server_add.sin_family = AF_INET;
server_add.sin_addr.s_addr = htonl(INADDR_ANY);
server_add.sin_port = htons(9734);
server_len = sizeof(server_add);
//测试时服务端和客户端是在同一台机器上运行的,需使用setsockopt设置一下
//允许重复使用本地地址和套接字绑定
int j=1;
setsockopt(server_sockfd,SOL_SOCKET,SO_REUSEADDR,&j,sizeof(j));
if(bind(server_sockfd,(struct sockaddr *)&server_add,server_len) == -1){ //给服务端套接字命名
perror ("bind fail");
         exit (EXIT_FAILURE);
}
listen(server_sockfd,5); //创建连接队列,开始等待客户连接,队列数为5
signal(SIGCHLD,SIG_IGN); //忽略sigchld信号避免产生僵尸进程
while(1)
{
printf("server waiting\n");
client_len = sizeof(client_add);
client_sockfd = accept(server_sockfd,(struct sockaddr *)&client_sockfd,&client_len);
if(client_sockfd == -1)
{
     perror("accept error:");
     exit(1);
}
pid = fork();
if(pid == 0)
{
//没对client_sockfd读写,只是验证下socket
close(client_sockfd);
exit(0);
}
else if(pid>0)
close(client_sockfd);
else{
perror("fork error");
exit(1);
}
}
}
client.c:
#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<sys/un.h>
#include<unistd.h>
#include<stdlib.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include <sys/stat.h>
#include <fcntl.h>

int main()
{
int socketfd,len,result;
struct sockaddr_in server_add;
if((socketfd = socket(AF_INET,SOCK_STREAM,0)) == -1)
{
perror ("socket create fail");
         exit (EXIT_FAILURE);
}
bzero(&server_add,sizeof(server_add));
server_add.sin_family = AF_INET;
server_add.sin_addr.s_addr = inet_addr("127.0.0.1");
server_add.sin_port = htons(9734);
bzero(&(server_add.sin_zero),8) ;
len = sizeof(server_add);
result = connect(socketfd,(struct sockaddr *)&server_add,len);
if (result == -1) {
perror ("connect server fail");
exit (EXIT_FAILURE);
     }
//同样为对socketfd操作

close(socketfd); //良好的习惯,一个套接字使用完要关闭
exit (0);
}

为了代码看起来更简短,对打开的sokcetfd我都没有去读写,原意是要发送接受文件。
运行之后会出现socket operation on non-socket,网上说这个错误是=和==优先级问题,可我这份代码并无这样的问题,希望大神帮我下,卡一天了

3 个解决方案

#1


求帮助啊~~~

#2


人呢。。。。。。。。。。。

#3


socket不是跨进程对象吧。

#1


求帮助啊~~~

#2


人呢。。。。。。。。。。。

#3


socket不是跨进程对象吧。