c - recv() 返回 -1(失败并出现 10054 错误)
问题描述
当我的客户端向服务器发送请求(两者都是用 C 编写的)recv()
时,客户端失败并出现错误 10054 ( WSAECONNRESET
)。我的服务器是在定义的端口上运行的 Windows 服务。
建立连接,双方都创建了套接字,但是在发送/接收时,我遇到了这个问题:/
---> 服务器代码 <----
WSADATA wsa;
SOCKET MainSock, AcceptSock;
int c = sizeof(struct sockaddr_in);
char client_req[1024] = { 0 };
int req_size;
char *end = NULL;
if (WSAStartup(MAKEWORD(2, 0), &wsa) != 0)
{
fprintf(fptr, " WSAStartup Failed. Error Code : %d", WSAGetLastError());
return 1;
}
//Create a socket
if ((MainSock = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
fprintf(fptr, " Could not create socket : %d\n", WSAGetLastError());
//Prepare the sockaddr_in structure
server.sin_family = AF_INET;
server.sin_addr.s_addr = INADDR_ANY; //inet_addr("10.10.1.18");
server.sin_port = htons(PORT);
//Bind
if (bind(MainSock, (struct sockaddr *)&server, sizeof(server)) == SOCKET_ERROR)
fprintf(fptr, " Bind failed with error code : %d\n", WSAGetLastError());
//Listen to incoming connections
if ((listen(MainSock, SOMAXCONN)) == SOCKET_ERROR)
fprintf(fptr, " listen failed with error code : %d\n", WSAGetLastError());
//Accept and incoming connection
fprintf(fptr, "\n\n Waiting for incoming connections...");
if ((AcceptSock = accept(MainSock, (struct sockaddr *)&client, &c)) != INVALID_SOCKET)
{
fprintf(fptr, "\n Connection accepted on %s", getCurrTime());
req_size = recv(AcceptSock, client_req, 1024, 0);
if (req_size > 0)
{
//stuff to do
}
}
---> 客户代码 <----
char *ReturnedData = CreatePacket();
encrypt(ReturnedData);
if ((sent_bytes = send(ServiceSock, ReturnedData, strlen(ReturnedData), 0)) < 0)
{
err = GetLastError();
DisplayError = malloc(MINCHAR * sizeof(char));
sprintf(DisplayError, "Unable to communicate. (%d)", err);
MessageBox(NULL, DisplayError, "Error!", MB_ICONEXCLAMATION | MB_OK);
free(DisplayError);
return err;
}
if ((recv_size = recv(ServiceSock, Service_reply, 10000, 0)) == SOCKET_ERROR) //Failed here with 10054
{
err = WSAGetLastError();
DisplayError = malloc(MINCHAR * sizeof(char));
sprintf(DisplayError, "Unable to receive information. (%d)", err);
MessageBox(NULL, DisplayError, " Error!", MB_ICONEXCLAMATION | MB_OK);
free(DisplayError);
return err;
}
else
{
//stuff to do
}
解决方案
推荐阅读
- php - mkdir() 返回 No such file or directory in ... on line ..
- xml - 所有(或至少是最常见的)W3C 默认模式和 DTD 的下载位置
- c# - ViewModel中的Task导致的内存泄漏
- angular - 我在构建代理集角度站点时遇到问题
- strapi - STRAPI:如何从管理 ui 中的管理控制器获取数据
- android - Google 广告服务以错误结束构建
- git - sed:-e 表达式#1,字符 10:Windows 上 git 中“s”的未知选项
- android - Volley 只给我:onErrorResponse
- protractor - 我们可以使用茉莉花在量角器中建立规范文件之间的依赖关系吗?
- c# - Html.BeginCollectionItem 上的列表在提交 {get; 放;}