Winsock echo服务器端口

时间:2015-07-16 18:09:26

标签: c sockets tcp winsock

我正在尝试在Windows下移植这个简单的TCP回显程序(https://github.com/mafintosh/echo-servers.c/blob/master/tcp-echo-server.c)用于教学目的。 我的改编编译并运行,但它不起作用:

****编辑:听取电话以某种方式被删除。感谢Remy ****

客户端连接,但没有任何回声。

移植代码如下(错误消息是意大利语,但它们应该很清楚):

having

2 个答案:

答案 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)