C服务器套接字接受没有请求的客户端
C server socket accepts clients with no request
我会保持简单
代码:
#include "stdafx.h"
#include <winsock2.h>
#include <conio.h>
#include <iostream>
#include <stdio.h>
#include <tchar.h>
int _tmain(int argc, _TCHAR* argv[])
{
WSADATA wsadata;
int error = WSAStartup(0x0202, &wsadata);
if(error) printf("WinSock error!");
SOCKET server;
struct sockaddr_in server_addr;
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(5657);
server_addr.sin_addr.s_addr = htonl (INADDR_ANY);
server = socket(AF_INET, SOCK_STREAM, 0);
if (server == INVALID_SOCKET) printf("INVALID SOCKET!");
error = bind(server, (LPSOCKADDR)&server_addr, sizeof(server_addr));
if(error) printf("Connect Error!");
listen(server, SOMAXCONN);
printf("SERVER ESTABLISHED! LISTENING...n");
sockaddr_in client_addr;
SOCKET client;
client = accept(server, (struct sockaddr*)&client_addr, (int *)sizeof(client_addr));
if(client==INVALID_SOCKET) printf("INVALID SOCKET!n");
printf("A CLIENT!");
closesocket(server);
WSACleanup();
getch();
return 0;
}
但我得到的是:
服务器已建立!正在听。。。无效套接字!客户!
我已经在C#中完成了套接字,我想服务器应该侦听并等待客户端,每当客户端请求连接时,服务器都应该接受它,但服务器不等待就接受了套接字,而且这个接受的套接字也是无效的!为什么会发生这种情况,我该如何解决?
这:
(int *)sizeof(client_addr)
是错误的,您正在将大小转换为指针。
socklen_t client_addr_len = sizeof(client_addr);
client = accept(server, (struct sockaddr*)&client_addr, &client_addr_len);
(int *)sizeof(client_addr)
您将client_addr大小强制转换为int*,因此您有一个指针,指向一个与client_addl大小相等的地址。
你需要做:
socklen_t clntAddrLen = sizeof(client_addr);
client = accept(server, (struct sockaddr*)&client_addr, &clntAddrLen);
这种方式不同,因为您有一个类型为socklen_t的变量,它保存了client_addr的大小。然后,你会得到一个指针(带&),指向包含该数字的内存地址,这就是你想要的。
问题可能是accept将尝试写入提供给它的最后一个参数。
更改为:
int client_addr_size = sizeof(client_addr);
client = accept(server, (struct sockaddr*)&client_addr, &client_addr_size);
检查WSAGetLastError的值将提供失败的原因。
相关文章:
- 节点.js HTTP 无法通过套接字接收来自C++客户端的请求
- C++HTTP客户端在GET请求后挂起read()调用
- 如何将请求的客户端连接的 IP 与 QTcpSocket 类中识别的 IP 之一进行比较?
- 如何在函数内部使用 zmq(以非阻塞方式)在客户端请求时获取函数的状态?
- Capnproto - 在服务器回调中发出客户端请求
- 异步WT :: HTTP ::客户端响应和请求匹配
- 如何在 gRPC 的异步C++客户端中为每个请求设置超时?
- 当发送多个同时请求时,单线程异步系统中Beast Boost异步HTTP客户端的行为
- 使用 select() 的请求/回复服务器。无法写回客户端
- 用于C++的Google API客户端库与用于发送HTTP请求的libcurl
- HTTP 请求使用 Google API 客户端库进行C++
- 如何使用套接字实现服务器客户端编程,在套接字中服务器向客户端发送消息而不从客户端获取请求
- Zeromq如何制作一个允许它不等待客户端请求的C ++服务器程序
- 如何从 http 请求中获取客户端 IP
- 客户端无法通过udp连接向服务器发送请求
- C服务器套接字接受没有请求的客户端
- 如何在一个套接字上实现并行请求和响应的非阻塞客户端-服务器通信模型,而不存在数据竞争
- DHCP客户端信息请求
- 什么OOD设计模式应该用于服务器-处理-客户端请求
- 对于客户端服务器程序,并行接收多个客户端连接请求的最佳方法是什么