c++;套接字读取()在连接到服务器时返回-1 我是C++新手,我正在处理socket编程,同时从服务器发送数据到客户端。读()函数在某个时候返回1,在某个时候它返回64并且工作良好。我在下面附上了我的代码,请给我一个更好的解决方案
server.cppc++;套接字读取()在连接到服务器时返回-1 我是C++新手,我正在处理socket编程,同时从服务器发送数据到客户端。读()函数在某个时候返回1,在某个时候它返回64并且工作良好。我在下面附上了我的代码,请给我一个更好的解决方案,c++,sockets,C++,Sockets,server.cpp if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) { logger("socket failed"); exit(EXIT_FAILURE); } // Forcefully attaching socket to the port 8080 if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT,
if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0)
{
logger("socket failed");
exit(EXIT_FAILURE);
}
// Forcefully attaching socket to the port 8080
if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT,
&opt, sizeof(opt)))
{
logger("setsockopt");
exit(EXIT_FAILURE);
}
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_addr.s_addr = inet_addr("192.168.0.4");
address.sin_port = htons( PORT );
// Forcefully attaching socket to the port 8080
if (bind(server_fd, (struct sockaddr *)&address,
sizeof(address))<0)
{
logger("bind failed");
exit(EXIT_FAILURE);
}
if (listen(server_fd, 3) < 0)
{
logger("listen");
exit(EXIT_FAILURE);
}
while (true)
{
if ((new_socket = accept(server_fd, (struct sockaddr *)&address,
(socklen_t*)&addrlen))<0)
{
logger("socket not accept");
exit(EXIT_FAILURE);
}
//valread = read( new_socket , buffer, 1024);
//printf("%s\n",buffer );
send(new_socket , hash_key , strlen(hash_key) , 0 );
//printf("Hello message sent\n");
}
return 0;
if((服务器fd=socket(AF\u INET,SOCK\u STREAM,0))==0)
{
记录器(“套接字失败”);
退出(退出失败);
}
//将插座强制连接至端口8080
if(setsockopt)(服务器fd、SOL_套接字、SO_REUSEADDR | SO_REUSEPORT、,
&opt,sizeof(opt)))
{
记录器(“setsockopt”);
退出(退出失败);
}
address.sin_family=AF_INET;
address.sin_addr.s_addr=INADDR\u ANY;
address.sin_addr.s_addr=inet_addr(“192.168.0.4”);
address.sin_port=htons(port);
//将插座强制连接至端口8080
if(bind(server_fd,(struct sockaddr*)和address,
sizeof(address))您侦听来自客户端的传入连接,并在服务器端的同一个循环中将数据发送给客户端。
您应该使用线程将它们分开。您的服务器代码在接受例程上阻塞。您侦听来自客户端的传入连接,并在服务器端的同一个循环中将数据发送到客户端。
您应该使用线程将它们分开。您的服务器代码在接受例程上阻塞。请参阅man 2 read
。将errno
设置为什么?您应该执行if(valread==-1)perror(“read”);
打印出实际发生的错误。您可以看一下。在这个程序中,我实现了接受器/连接器反应器/前置器/动作模式。问题可能是您可以接受很多连接。您需要正确处理返回的fd。存储在向量或某处。很抱歉,但不是那么容易…请参阅man 2读取。errno
设置为什么?如果(valread==-1)perror(“读取”),则应执行;
打印出实际发生的错误。您可以看一下。在这个程序中,我实现了接受器/连接器反应器/前置器/动作模式。问题可能是您可以接受很多连接。您需要正确处理返回的fd。存储在向量或某物中。抱歉,但不是那么容易…请避免使用tel他们应该将最小示例代码分解为多个线程。这会使出现的问题过于复杂,并不总是一个好的设计路径。这里的问题在于使用connect
,除了EINPROGRESS
之外,它可能会因代码未处理的原因或在处理返回fr时失败om阅读
。请避免告诉人们他们应该将最小示例代码分解为多个线程。这会使出现的问题过于复杂,并不总是一个好的设计路径。这里的问题是使用连接
,除了EINPROGRESS
未处理的原因之外,它可能会失败处理从读取的返回时的代码或。
arg |= O_NONBLOCK;
if( fcntl(sock, F_SETFL, arg) < 0) {
fprintf(stderr, "Error fcntl(..., F_SETFL) (%s)\n", strerror(errno));
exit(0);
}
int res;
res = connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr));
if (res < 0) {
if (errno == EINPROGRESS) {
fprintf(stderr, "EINPROGRESS in connect() - selecting\n");
do {
tv.tv_sec = 50;
tv.tv_usec = 0;
FD_ZERO(&myset);
FD_SET(sock, &myset);
res = select(sock+1, NULL, &myset, NULL, &tv);
if (res < 0 && errno != EINTR) {
fprintf(stderr, "Error connecting %d - %s\n", errno, strerror(errno));
exit(0);
}
else if (res > 0) {
// Socket selected for write
lon = sizeof(int);
if (getsockopt(sock, SOL_SOCKET, SO_ERROR, (void*)(&valopt), &lon) < 0) {
fprintf(stderr, "Error in getsockopt() %d - %s\n", errno, strerror(errno));
exit(0);
}
// Check the value returned...
if (valopt) {
fprintf(stderr, "Error in delayed connection() %d - %s\n", valopt, strerror(valopt)
);
exit(0);
}
break;
}
else {
fprintf(stderr, "Timeout in select() - Cancelling!\n");
exit(0);
}
} while (1);
}
else {
fprintf(stderr, "Error connecting %d - %s\n", errno, strerror(errno));
exit(0);
}
valread = read( sock , buffer, 1024);
cout<<valread<<endl;