gpt4 book ai didi

c - socket编程报错10054

转载 作者:太空宇宙 更新时间:2023-11-04 07:07:43 26 4
gpt4 key购买 nike

我正在用 C 编写套接字编程代码,并且在同一台计算机上运行客户端和服务器。这是服务器的代码

  int main()
{
WSADATA wsa;
if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0)
{
cout << "WSAStartup failed!" << endl;
return -1;
}

SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sock == INVALID_SOCKET)
{
cout << "socket failed with error:" << WSAGetLastError() << endl;

WSACleanup();
return -1;
}

struct sockaddr_in service;
service.sin_addr.s_addr = inet_addr("127.0.0.1");
service.sin_family = AF_INET;
service.sin_port = htons(5059);

if (bind(sock, (SOCKADDR *)&service, sizeof(service)) == SOCKET_ERROR)
{
cout << "bind failed with error:" << WSAGetLastError() << endl;

closesocket(sock);
WSACleanup();
return -1;
}

if (listen(sock, 5) == SOCKET_ERROR)
{
cout << "listen failed with error:" << WSAGetLastError() << endl;

closesocket(sock);
WSACleanup();
return -1;
}
while (true)
{
cout << "Waiting for a PKCS11 client ..." << endl;

SOCKET accsock = accept(sock, NULL, NULL);
if (accsock == INVALID_SOCKET)
{
cout << "accept failed with error:" << WSAGetLastError() << endl;

closesocket(sock);
WSACleanup();
return -1;
}

cout << "PKCS11 client connected ..." << endl;

while (true)
{
int receive_size = 0;
char test[20];
receive_size = recv(accsock, test, 20, 0);
if (receive_size == SOCKET_ERROR)
{
cout << endl << "ERROR : "<<WSAGetLastError() << " PKCS11 client disconnected." << endl;
closesocket(accsock);
break;
}

test[receive_size] = '\0';
command = temp;
printf("recieved value is : %s\n",test);
}
}

这是客户端的代码

int main(){
/*CK_SESSION_HANDLE hSession = NULL;
CK_MECHANISM_PTR pMechanism = NULL;
CK_OBJECT_HANDLE hKey = NULL;
C_EncryptInit(hSession, pMechanism, hKey);*/

char temp[10];
printf("initialising ... \n");
if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0)
{
printf("Error = :%d", WSAGetLastError());
WSACleanup();
return -1;
}
printf("initialised\n");
//create a socket
if ((s = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
{
printf("Could not create socket : %d", WSAGetLastError());
WSACleanup();
return -1;
}

printf("Socket created.\n");


server.sin_addr.s_addr = inet_addr("127.0.0.1");
server.sin_family = AF_INET;
server.sin_port = htons(5059);

//Connect to remote server
if (connect(s, (struct sockaddr *)&server, sizeof(server)) < 0)
{
puts("connect error");
return 1;
}

puts("Connected");


_itoa(CK_ENCRYPT, temp, 16);
command = temp;
int counter = 0;
char* test = "H";
while (counter != strlen(test)) {
counter += send(s, test, strlen(test), 0);
cout << counter << endl;
}


//while (1);
return 0;
}

问题是,当我尝试从客户端向服务器发送超过一个字节时,我会收到 10054 错误,除非我取消注释 while(1) 行,在这种情况下,我会在服务器中正确接收消息。有没有人有任何想知道这段代码有什么问题吗?

最佳答案

你的客户端正在发送数据,它将数据放入IP栈中进行发送。然后它立即终止,这意味着 IP 堆栈将取消发送并不正常地关闭套接字。

在终止客户端之前,您需要关闭closesocket 套接字。

关于c - socket编程报错10054,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31242575/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com