我的recv函数在从服务器获得响应时挂起.
c/c ++中的客户端代码:
void sockStuff() {
int sock, bytes_recieved,bytes_send;
char send_data[1024], recv_data[4096];
struct hostent *host;
struct sockaddr_in server_addr;
host = gethostbyname("127.0.0.1");
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
perror("SocketError");
exit(1);
}
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(50500);
server_addr.sin_addr = *((struct in_addr *) host->h_addr);
bzero(&(server_addr.sin_zero), 8);
if (connect(sock, (struct sockaddr *) &server_addr, sizeof(struct sockaddr))
== -1) {
perror("ConnectToError");
exit(1);
}
bytes_send = send(sock, a, strlen(a), 0);
bytes_send = shutdown(sock, 1);
bytes_recieved = recv(sock, recv_data, 4096, 0); //Where the program hangs??
recv_data[bytes_recieved] = '\0';
printf("\nRecieved data = %s ", recv_data);
cout << endl << endl;
shutdown(sock,2);
}
Run Code Online (Sandbox Code Playgroud)
我的客户端是C/C++,服务器端是OpenEdge Progress.请查看代码并建议出现问题.
您的代码将在recv调用中阻塞,直到服务器发回任何数据.既然没有发生这种情况,也许您应该问问自己您的客户是否发送了完整的请求.在收到完整请求之前,服务器可能不会开始发送响应.
如果您的客户端/服务器协议是基于文本的,如HTTP或SMTP,您确定您的响应是否正确终止?服务器可能期望CR + LF('\ r \n')而不仅仅是LF('\n'),或者它期望空行终止请求:
char *request = "GET /index.html HTTP/1.1\r\nHost: www.example.com\r\n\r\n";
Run Code Online (Sandbox Code Playgroud)
PS.您不会在代码段中声明或初始化"a".
小智 5
您的代码将在 recv 调用中阻塞,直到服务器发回任何数据。既然这没有发生,也许您应该问问自己,您的客户是否发送了完整的请求。在收到完整的请求之前,服务器可能不会开始发送响应。
如果您的客户端/服务器协议是基于文本的,例如 HTTP 或 SMTP,您确定您的响应已正确终止吗?服务器可能需要 CR+LF ('\r\n') 而不是 LF ('\n') 或者它需要一个空行来终止请求:
char *request = "GET /index.html HTTP/1.1\r\nHost: www.example.com\r\n\r\n"; 附注。您不会在代码片段中声明或初始化 'a'。” by notacat
我在 win 上用 C++ 编写早期 winsock 1.0 和 1.1 实现的副本。我的代码一直工作到 recv() 调用,然后就挂在那里......我知道阻塞\非阻塞套接字,但这不是我需要的解决方案。由于我在wireshark 或类似程序中看到了我的请求,因此我知道服务器正在端口 80 上接收我的字符串结尾请求,并且由于我的客户端和网络上的服务器之间没有通信,我的代码在 recv() 调用时冻结。这让我相信我没有提交正确的请求。好吧,作者(notaket)在现场!。一旦我改变了他的请求( "GET /index.html HTTP/1.1\r\nHost: www.example.com\r\n\r\n") ,一切似乎都像魅力一样!谢谢!!