Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.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 - Fatal编程技术网

C 非套接字上的套接字操作:设置套接字选项和绑定套接字时出错

C 非套接字上的套接字操作:设置套接字选项和绑定套接字时出错,c,sockets,C,Sockets,运行时,程序发出 非套接字上的套接字操作:绑定套接字时出错 之后,当我使用setsockopt() 这又给了我一个错误: socket operation on non socket, error while setting options to socket. 我目前正在使用Ubuntu 16.04。有什么问题吗 操作系统还是我的代码?(因为我已经看到了我正在使用的端口 这里没有被任何其他程序使用,我尝试过改变 端口号为10000,范围也为56000) #包括 #包括 #包括 #包括 #包括

运行时,程序发出

非套接字上的套接字操作:绑定套接字时出错

之后,当我使用
setsockopt()
这又给了我一个错误:

socket operation on non socket, error while setting options to socket.
我目前正在使用Ubuntu 16.04。有什么问题吗 操作系统还是我的代码?(因为我已经看到了我正在使用的端口 这里没有被任何其他程序使用,我尝试过改变 端口号为10000,范围也为56000)

#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#定义端口7890
int main()
{
int sock_fd,新sockfd;
主机地址、客户端地址中的结构sockaddr\u;
袜子的大小;
int recv_长度,是=1;
字符缓冲区[1024];
if(sock\u fd=socket(AF\u INET,sock\u STREAM,0)=-1)
{
perror(“在创建套接字时”);
出口(-1);
}   
其他的
printf(“套接字:成功\n”);
if(setsockopt(sock\u fd,SOL\u SOCKET,SO\u REUSEADDR,&yes,sizeof(int))=-1)
perror(“在设置套接字选项时,\u REUSEADDR\n”);
其他的
printf(“套接字选项:成功\n”);
host_addr.sin_family=AF_INET;
主机地址sin\u端口=htons(端口);
主机地址sin地址s地址=0;
memset(&(主机地址sin_zero),'\0',8);
if(bind(sock_fd,(struct sockaddr*)和host_addr,sizeof(struct sockaddr))=-1)
perror(“绑定时”);
其他的
printf(“绑定:成功\n”);
如果(监听(sock_fd,5)=-1)
perror(“在听的时候”);
其他的
printf(“侦听:成功\n”);
而(1)
{
sin_size=sizeof(结构sockaddr_in);
new_sockfd=accept(sock_fd,(struct sockaddr*)和client_addr,以及sin_size);
如果(新的_sockfd==-1)
{
perror(“未能接受\n”);
出口(-1);
}   
其他的
printf(“接受:成功”\n);
printf(“服务器从IP地址:%s、端口号:%d\n”、inet\u ntoa(客户端地址sin\u addr)、ntohs(客户端地址sin\u端口));
发送(新的“你好,混蛋!\n”,16,0);
recv_length=recv(新的_sockfd和缓冲区,1024,0);
而(记录长度>0)
{
printf(“已接收%d字节\n”,记录长度);
recv_length=recv(新的_sockfd和缓冲区,1024,0);
}
关闭(新建);
}
返回0;
}

常见的运算符优先级问题:

if(sock_fd = socket(AF_INET, SOCK_STREAM, 0) == -1)     
应该是

if((sock_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1)     

if(sock\u fd=socket(AF\u INET,sock\u STREAM,0)=-1)
并没有达到您期望的效果。注意操作符的优先级<代码>=绑定比
=
更紧密。为什么在网络代码中会一次又一次地犯这个错误?为什么他们对出错的复合布尔表达式着迷?开发人员是不是太懒了,不能使用两行代码,这样就可以很容易地进行调试?让我困惑的是:(
if((sock_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1)