connect()在UDP客户端服务器中给C窗口中的IPv6地址给出错误

在这里,我试图在Windows中使用IPV6地址从服务器发送和接收数据。 在客户端代码中,我没有获取服务器的地址以便发送数据或接收数据。 在testing我的代码时,我发现客户端代码中的Connect()给出了运行时错误。 有可能是我不能在memmove()中正确地复制地址。 在客户端代码实际上我试图使用gethostbyaddr(),但仍然不能发送或接收数据..帮助我这一点。 那我怎样才能连接到服务器…还发送和接收数据..在此先感谢

* / 客户端代码Udp_win_IP6_Client.c / *

#include <stdio.h> #include <stdlib.h> #include <winsock2.h> #include <ws2tcpip.h> #include <stdio.h> #include <windows.h> #pragma comment(lib,"ws2_32.lib") int main() { struct sockaddr_in6 client6; WORD wVersionRequested; int wsaerr; socklen_t size; struct hostent *server; WSADATA wsaData; char buffer[1024] = "Hi Harshpal Server"; int k; printf("\n Ready for Sending...\n"); wVersionRequested = MAKEWORD(2, 2); wsaerr = WSAStartup(wVersionRequested, &wsaData); SOCKET clientsockfd; clientsockfd = socket(AF_INET6, SOCK_DGRAM, 0); if (clientsockfd == INVALID_SOCKET) printf("\n Error.... "); else printf("\n Successful Creation...."); server = gethostbyname("::1"); if(server < 0) printf("\n Couldnt get hostname"); else printf("\n Got the hostname"); memset((char *) &client6, 0, sizeof (client6)); printf("\n Memory set \n"); client6.sin6_flowinfo = 0; client6.sin6_family = AF_INET6; memmove((char *) &client6.sin6_addr.s6_addr, (char *)server->h_name, server->h_length); client6.sin6_port = htons(5000); size = sizeof client6; if (connect(clientsockfd, (struct sockaddr *) &client6, sizeof (client6)) == SOCKET_ERROR) printf("ERROR connecting"); else printf("Connected..."); printf("Type a sentence to send to server:\n"); scanf("%s", buffer); printf("You typed: %s\n", buffer); int n = send(clientsockfd, buffer, strlen(buffer) + 1, 0); sendto(clientsockfd, buffer, n, 0, (struct sockaddr *) &client6, size); memset(buffer, 0, 1024); n = recvfrom(clientsockfd, buffer, 1024, 0, NULL, NULL); printf("This is Message Received from server: %s\n", buffer); closesocket(clientsockfd); return 0; } 

* / *服务器端代码Udp_win_IP6_Server.c /

  #include <stdio.h> #include <stdlib.h> #include <winsock2.h> #include <ws2tcpip.h> #pragma comment(lib,"ws2_32.lib") int main() { WORD wVersionRequested; int wsaerr; WSADATA wsaData; char buffer[1024]; int k; printf("\n Ready for Receiving...\n"); wVersionRequested = MAKEWORD(2, 2); wsaerr = WSAStartup(wVersionRequested, &wsaData); SOCKET sockfd; sockfd = socket(AF_INET6, SOCK_DGRAM, 0); if(sockfd == INVALID_SOCKET) printf("\n Error.... "); else printf("\n Successful Creation...."); struct sockaddr_in6 server6; memset(&server6, 0, sizeof (server6)); server6.sin6_family = AF_INET6; server6.sin6_addr = in6addr_any; server6.sin6_port = htons(5000); if(bind(sockfd, (struct sockaddr *)&server6 , sizeof(server6))==-1) { printf("\n Error in binding..\n"); } else{ printf("\n Binding successful...\n"); } k = sizeof(server6); recvfrom(sockfd, buffer, sizeof(buffer), 0, (struct sockaddr *) &server6, &k); printf("\n Message from client %s: ", buffer); strcpy(buffer,"Hi Harshpal Client..."); sendto(sockfd, buffer, sizeof(buffer), 0, (struct sockaddr*) &server6,k); closesocket(sockfd); return 0; } 
  • 直接使用gcc运行代码Udp_win_IP6_Server.c -o Udp_win_IP6_Server.o
  • 和gcc Udp_win_IP6_Client.c -o Udp_win_IP6_Client.o
  • 或者你可以在任何IDE中运行。
  • 在运行代码时不需要指定地址或端口,因为我已经在代码中给出了代码。

我相信if (server < 0)检查不正确,因为server是一个指针,因此无符号。 你只需要检查它是否为NULL 。 此外, gethostbyname()已被弃用,但是让它成为示例代码。

Memmove的一部分也似乎是错误的。 您需要从h_addr_list解析地址,而不是从h_name 。 所以你的client6初始化应该是:

 struct sockaddr_in6 client6; memset(&client6, 0, sizeof(client6)); client6.sin6_family = AF_INET6; client6.sin6_port = htons(5000); memcpy(&client6.sin6_addr, server->h_addr_list[0], server->h_length); 

我刚刚得到了答案….这是我的代码…很高兴与你分享…..保持server.c相同,只有代替client.c通过以下代码:-)

 #include <winsock2.h> #include <windows.h> #include <ws2tcpip.h> #include <mstcpip.h> #include <stdlib.h> #include <stdio.h> #pragma comment(lib,"ws2_32.lib") int main() { char Buffer[1024] = "This is Client \n"; char FromserverBuffer[1024]; char hostname[1024]; SOCKADDR_STORAGE From; WSADATA wsaData; ADDRINFO Hints, *AddInf, *AI; int RetVal, gaddr, i; LPSOCKADDR sockaddr_ip; WSAStartup(MAKEWORD(2, 2), &wsaData); // Intializing dll required.. memset(&Hints, 0, sizeof (Hints)); char ipstringbuffer[50]; DWORD ipbufferlength = 50; SOCKET ConnSocket; Hints.ai_family = PF_UNSPEC; Hints.ai_socktype = SOCK_DGRAM; Hints.ai_flags = AI_PASSIVE; // Setting family, socktype and flag. gaddr = getaddrinfo("::1", "5000", &Hints, &AddInf); // getaddrinfo() will give information about address. for (AI = AddInf; AI != NULL; AI = AI->ai_next) { sockaddr_ip = (LPSOCKADDR) AI->ai_addr; // This loop to place IP and port into the list of IP addresses. int iRetval = WSAAddressToString(sockaddr_ip, (DWORD) AI->ai_addrlen, NULL, ipstringbuffer, &ipbufferlength); // Convert address in readable format.. printf("\tIPv6 address %s\n", ipstringbuffer); ConnSocket = socket(AI->ai_family, AI->ai_socktype, AI->ai_protocol); // Creating Socket... if (ConnSocket == INVALID_SOCKET) printf("socket call failed.. \n"); if (connect(ConnSocket, AI->ai_addr, (int) AI->ai_addrlen) != SOCKET_ERROR) { // Connecting client socket to server.. printf("Connection Establish..\n"); } else printf("Connection not establish.."); int FromLen = sizeof (From); RetVal = send(ConnSocket, Buffer, sizeof (Buffer), 0); // Sending data to server using send(). //RetVal = sendto(ConnSocket, Buffer, sizeof (Buffer), 0, (LPSOCKADDR) & From, FromLen); if (RetVal < 0) { printf("Sending failed..\n"); } else printf("Sending Successful..\n"); int AmountRead = recvfrom(ConnSocket, FromserverBuffer, sizeof (FromserverBuffer), 0, (LPSOCKADDR) & From, &FromLen); // Receiving data using recvfrom.. printf("Data Received From server: %s", FromserverBuffer); } closesocket(ConnSocket); return 0; }