Tcp accept 10038错误

问题:

自己做着东西玩,一个对话框界面的服务器端,对话框上面有两个Button,一个用于启动服务器工作,一个用来停止服务器。第一次启动和停止的时候工作都正常,当停止服务器再启动的时候,在Tcp监听线程中accept()出错,错误代码10038。


资料:

MSDN上对10038的描述

WSAENOTSOCK
10038

Scoket operation on nonsocket.
An operation was attempted on something that is not a socket. Either the socket handle parameter did not reference a valid socket, or for select, a member of an fd_set was not valid.

试图在非socket上执行socket操作。或者是socket的句柄引用了一个无效的socket,或者是在select中,fd_set的一个成员是无效的。


解决:

原因在于对话框初始化的时候对socket进行了初始化,在停止服务器的时候关闭了套接字closesocket(),所以第二次启动的时候socket没有初始化,accept()出错。将socket的初始化工作写在启动服务器的命令响应中解决问题。


总结:

两个交互的过程中,初始化和清理工作要么都分别写在这两个过程中,要么初始化和清理都不写在这两个中。



TCP中,accept()函数用于从处于监听状态的套接字中接受一个客户端的连接请求,并返回一个新的已连接套接字,以便服务器与客户端之间进行通信。其函数原型如下所示: ```c int accept(int sockfd, struct sockaddr *cliaddr, socklen_t *addrlen); ``` 其中,sockfd是服务器套接字描述符,cliaddr是指向结构体sockaddr的指针,用于存储客户端的地址信息,addrlen是一个指向整型变量的指针,用于存储客户端地址结构体的长度。 当accept()函数成功时,它将返回一个新的已连接套接字描述符,该描述符用于与客户端进行通信。如果失败,则返回-1,并设置errno变量以指示错误类型。 需要注意的是,accept()函数是一个阻塞函数,即当没有客户端连接请求时,它将一直等待,直到有客户端连接请求到达为止。 下面是一个简单的C语言示例,演示了如何使用accept()函数接受客户端连接请求: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <arpa/inet.h> #define PORT 8080 int main(int argc, char const *argv[]) { int server_fd, new_socket; struct sockaddr_in address; int addrlen = sizeof(address); // 创建服务器套接字 if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) { perror("socket failed"); exit(EXIT_FAILURE); } // 设置服务器地址和端口 address.sin_family = AF_INET; address.sin_addr.s_addr = INADDR_ANY; address.sin_port = htons(PORT); // 绑定服务器套接字 if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) { perror("bind failed"); exit(EXIT_FAILURE); } // 监听套接字 if (listen(server_fd, 3) < 0) { perror("listen failed"); exit(EXIT_FAILURE); } // 接受客户端连接请求 if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen)) < 0) { perror("accept failed"); exit(EXIT_FAILURE); } // 与客户端进行通信 char buffer[1024] = {0}; int valread = read(new_socket, buffer, 1024); printf("%s\n", buffer); send(new_socket, "Hello from server", strlen("Hello from server"), 0); printf("Hello message sent\n"); return 0; } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值