错误代码:
int main (int argc,char *argv[])
{
int lfd = 0,cfd = 0;
/* 定义服务器地址结构 和 客户端地址结构*/
struct sockaddr_in ser_addr,cli_addr;
/* 客户端地址结构大小*/
socklen_t cli_addr_len;
char cli_ip[1024],buf[1024];
/*地址结构 ip+端口号*/
ser_addr.sin_family = AF_INET; /* IPv4*/
ser_addr.sin_port = htons(SER_PORT); /* 转为网络字节序的 端口号*/
ser_addr.sin_addr.s_addr = htonl(INADDR_ANY); /* 获取本机任意有效IP*/
lfd = socket(AF_INET,SOCK_STREAM,0);
if(lfd == -1)
sys_err("socket fail \n");
**lfd = bind(lfd,(struct sockaddr *)&ser_addr,sizeof(ser_addr));**
**if(lfd == -1) sys_err("bind fail \n");
lfd = listen(lfd,128);
if(lfd == -1) sys_err("listen fail \n");****
cli_addr_len = sizeof(cli_addr);
/*accept的第二个参数是传出参数,传出和该服务器连接的客户端*/
cfd = accept(lfd,(struct sockaddr *)&cli_addr,&cli_addr_len);
if(cfd == -1) sys_err("accept fail \n");
......
}
用gcc编译以后,运行,报错:
listen fail : Socket operation on non-socket
经过一番检查,发现是接受 函数bind()和函数listen()的返回值的变量有错,不应该使用lfd,lfd在这里是socket函数返回的文件描述符,他是accept函数的输入。所以这里应该重新定义一个变量。
改动如下:
int lfd = 0,cfd = 0;
**int num;**
......
**num** = bind(lfd,(struct sockaddr *)&ser_addr,sizeof(ser_addr));
if(**num** == -1) { sys_err("bind fail \n");}
**num** = listen(lfd,128);
if(**num** == -1) {sys_err("listen fail \n");}
cli_addr_len = sizeof(cli_addr);
/*accept的第二个参数是传出参数,传出和该服务器连接的客户端*/
cfd = accept(lfd,(struct sockaddr *)&cli_addr,&cli_addr_len);
if(cfd == -1){ sys_err("accept fail \n");}
问题解决!!
本文详细解析了在C语言中,TCP服务器编程时bind和listen函数的常见错误及解决方案。指出将bind和listen的返回值赋给socket描述符是错误的,并提供了正确的代码示例。
1694

被折叠的 条评论
为什么被折叠?



