我正在尝试在Windows下移植这个简单的TCP回显程序(https://github.com/mafintosh/echo-servers.c/blob/master/tcp-echo-server.c)用于教学目的。 我的改编编译并运行,但它不起作用:
****编辑:听取电话以某种方式被删除。感谢Remy ****
客户端连接,但没有任何回声。
移植代码如下(错误消息是意大利语,但它们应该很清楚):
having
答案 0 :(得分:1)
您正在呼叫listen()
设置侦听端口,但在进入accept()
循环之前,您没有打电话accept()
实际开始侦听端口。
一旦你解决了这个错误,你的client_fd
循环就会被破坏,因为即使SOCKET_ERROR
成功,它也会强制accept()
到while()
。当=
条件需要使用==
比较运算符时,INVALID_SOCKET
条件正在使用SOCKET_ERROR
赋值运算符。您应该检查int
而不是SOCKET
。
现在说,还有其他一些事情需要考虑:
WinSock不使用UINT_PTR
来表示套接字,而是使用< 0
代替== INVALID_SOCKET
。检查无效的套接字句柄时,请勿使用WSAGetLastError()
,而是使用WSAStartup()
。
大多数套接字函数通过SO_REUSEADDR
返回错误代码(BOOL
是一个例外)。养成使用它的习惯,并在输出消息中报告错误代码,这样你才能知道失败的原因。
char
需要BOOL
值,而不是int
值。 recv()
是send()
的typedef,因此是4个字节。
并非所有套接字错误都是致命的,因此如果send()
/ #include <stdio.h>
#include <stdlib.h>
#include <winsock.h>
#define BUFFER_SIZE 1024
void on_error(char *s, int *errCode = NULL)
{
int err = (errCode) ? *errCode : WSAGetLastError();
fprintf(stderr, "%s: %d\n", s, err);
fflush(stderr);
exit(1);
}
int main(int argc, char *argv[])
{
WSADATA wsadata;
SOCKET server_fd, client_fd;
struct sockaddr_in server, client;
int port = 6666, err;
char buf[BUFFER_SIZE];
err = WSAStartup(MAKEWORD(2,2), &wsadata);
if (err != 0)
on_error("Errore in WSAStartup", &err);
server_fd = socket(AF_INET, SOCK_STREAM, 0);
if (server_fd == INVALID_SOCKET)
on_error("Non ho potuto creare il socket");
memset(&server, 0, sizeof(server));
server.sin_family = AF_INET;
server.sin_port = htons(port);
server.sin_addr.s_addr = INADDR_ANY;
/** bind & listen **/
const BOOL opt_val = TRUE;
setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, (char*)&opt_val, sizeof(opt_val));
err = bind(server_fd, (struct sockaddr *) &server, sizeof(server));
if (err == SOCKET_ERROR)
on_error("Non ho potuto fare il bind del socket");
err = listen(server_fd, 1);
if (err == SOCKET_ERROR)
on_error("Non ho potuto mettermi in ascolto sul socket");
printf("SERVER LISTENING ON PORT %d\n", port);
while (1)
{
int client_len = sizeof(client);
client_fd = accept(server_fd, (struct sockaddr *) &client, &client_len);
if (client_fd == INVALID_SOCKET)
on_error("Non riesco a stabilire una nuova connessione");
bool keepLooping = true;
do
{
int read = recv(client_fd, buf, BUFFER_SIZE, 0);
if (read == 0)
break;
if (read == SOCKET_ERROR)
{
err = WSAGetLastError();
if ((err != WSAENOTCONN) && (err != WSAECONNABORTED) && (err == WSAECONNRESET))
on_error("Errore nella lettura dal client", &err);
break;
}
char *pbuf = buf;
do
{
int sent = send(client_fd, pbuf, read, 0);
if (sent == SOCKET_ERROR)
{
err = WSAGetLastError();
if ((err != WSAENOTCONN) && (err != WSAECONNABORTED) && (err == WSAECONNRESET))
on_error("Errore nella scrittura verso il client", &err);
keepLooping = false;
break;
}
pbuf += sent;
read -= sent;
}
while (read > 0);
}
while (keepLooping);
closesocket(client_fd);
}
WSACleanup();
return 0;
}
操作因非致命错误而失败,则不应终止整个服务器。
document.querySelector(".entity").innerHTML += " - Smartphone|Desktop"
无法保证发送您要求发送的所有内容,因此您应该对此进行说明。
完成使用后,请不要忘记关闭已接受的客户端套接字。
试试这个:
// ==UserScript==
// @name Code Coverage
// @namespace script[id]
// @include http://127.0.0.1:8080/
// @version 1
// @grant none
// ==/UserScript==
document.querySelector(".entity").innerHTML += " - Smartphone|Desktop"
答案 1 :(得分:1)
对不起,但是
hist(b.ravel().astype(np.uint8), bins=255, range=(0,255))
不是吗?
while (client_fd = SOCKET_ERROR)