c语言 accept错误,socket accept error解决办法

socket accept error

linux下的server端编程,很简单,基本照抄apue:

int main(int argc, char** argv)

{

int  servfd,clifd;

struct  sockaddr_in servaddr,cliaddr;

if  ((servfd  =  socket(AF_INET,SOCK_STREAM, 0 ))  

{

printf( " create socket error!\n " );

exit( 1 );

}

bzero( & servaddr, sizeof (servaddr));

servaddr.sin_family  =  AF_INET;

servaddr.sin_port  =  htons(SERVER_PORT);

servaddr.sin_addr.s_addr  =  inet_addr("127.0.0.1");

inet_aton("127.0.0.1", & servaddr.sin_addr);

int on=1;

if((setsockopt(servfd,SOL_SOCKET,SO_REUSEADDR ,&on,sizeof(on)))<0)

{

perror("setsockopt failed");

exit(EXIT_FAILURE);

}

if(bind(servfd,( struct  sockaddr * ) & servaddr, sizeof (servaddr)) 

{

printf( " bind to port %d failure for %s\n " ,SERVER_PORT,  strerror(errno));

exit( 1 );

}

if(listen(servfd,LENGTH_OF_LISTEN_QUEUE)  

{

printf( " call listen failure!\n " );

exit( 1 );

}

while  ( 1 )

{

socklen_t length  =   sizeof (cliaddr);

clifd  =  accept(servfd,( struct  sockaddr * ) & cliaddr, & length);

if(clifd  

{

printf( " error comes when call accept for %s!\n ", strerror(errno));

break ;

}

printf( " from client,IP:%s,Port:%d\n " ,inet_ntoa(cliaddr.sin_addr),ntohs(cliaddr.sin_port));

pid_t pid = 0;

if ((pid = fork()) == 0){

close(servfd);

str_echo(clifd);

}

else{

close(clifd);

}

} // exit

close(servfd);

return   0 ;

}

有client连接上之后,server端接受这个连接后fork一个进程处理,但接着就会来一个accept for Bad file descriptor!错误!

求解啊,为什么?

------解决方案--------------------

str_echo(clifd); 这一句出的问题吗?

要在Windows下使用C语言实现TCP Socket编程,可以参考以下步骤: 1. 加载Winsock库 在程序中使用Winsock API之前,需要加载Winsock库。可以在程序中添加以下代码: ``` #include <winsock2.h> #pragma comment(lib, "ws2_32.lib") ``` 2. 创建Socket 可以使用`socket()`函数创建一个新的Socket。示例如下: ``` SOCKET socketfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (socketfd == INVALID_SOCKET) { // 处理创建Socket失败的情况 } ``` 其中,第一个参数`AF_INET`表示使用IPv4协议;第二个参数`SOCK_STREAM`表示使用TCP协议;第三个参数`IPPROTO_TCP`表示使用TCP协议。 3. 绑定Socket 可以使用`bind()`函数将Socket绑定到一个本地IP地址和端口号。示例如下: ``` struct sockaddr_in server_addr; server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); // 设置IP地址 server_addr.sin_port = htons(8888); // 设置端口号 int ret = bind(socketfd, (struct sockaddr*)&server_addr, sizeof(server_addr)); if (ret == SOCKET_ERROR) { // 处理绑定Socket失败的情况 } ``` 其中,`inet_addr()`函数将字符串形式的IP地址转换为网络字节序的32位整数。 4. 监听Socket 可以使用`listen()`函数将Socket设置为监听状态。示例如下: ``` int ret = listen(socketfd, SOMAXCONN); if (ret == SOCKET_ERROR) { // 处理设置监听失败的情况 } ``` 其中,`SOMAXCONN`表示等待连接的最大数量。 5. 接受连接 可以使用`accept()`函数接受客户端的连接请求,并返回一个新的Socket用于通信。示例如下: ``` struct sockaddr_in client_addr; int client_addr_len = sizeof(client_addr); SOCKET client_socketfd = accept(socketfd, (struct sockaddr*)&client_addr, &client_addr_len); if (client_socketfd == INVALID_SOCKET) { // 处理接受连接失败的情况 } ``` 其中,`client_addr`用于存储客户端的地址信息,`client_addr_len`表示`client_addr`的长度。 6. 发送和接收数据 可以使用`send()`函数向客户端发送数据,使用`recv()`函数接收客户端发送的数据。示例如下: ``` char buf[1024]; int buf_len = sizeof(buf); int ret = recv(client_socketfd, buf, buf_len, 0); if (ret == SOCKET_ERROR) { // 处理接收数据失败的情况 } ret = send(client_socketfd, buf, ret, 0); if (ret == SOCKET_ERROR) { // 处理发送数据失败的情况 } ``` 其中,`buf`用于存储数据,`buf_len`表示`buf`的长度。 7. 关闭Socket 可以使用`closesocket()`函数关闭Socket。示例如下: ``` closesocket(client_socketfd); closesocket(socketfd); ``` 注意,关闭Socket后不能再对其进行任何操作。 以上就是在Windows下使用C语言实现TCP Socket编程的基本步骤。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值