【发布时间】:2015-12-31 06:44:52
【问题描述】:
在这里,我尝试在 Windows 中使用 IPV6 地址从服务器发送和接收数据。在客户端代码中,我没有获取服务器的地址来发送数据或接收数据。在测试我的代码时,我发现客户端代码中的 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 中运行。
- 运行代码时无需指定地址或端口,正如我在代码中给出的那样。
【问题讨论】:
-
发布的代码似乎缺少#include 语句:
<sys/types.h><sys/socket.h><string.h><arpa/inet.h> -
那些对
gcc的调用将编译/链接代码,它们不会运行代码 -
警告:我对 ipv6 不太熟悉。关于这一行:
server = gethostbyname("::1");通常参数类似于:"google.com"通常域名是用于参数的 char 字符串的内容 -
@user3629249 感谢您的回复...您提到的那些头文件..我猜它只在 linux 上运行...如果我包含它会出错。我希望此代码仅在 Windows 上运行。而且我也对 server = gethostbyname("::1")....我尝试使用 gethostbyaddr...但没有任何变化... :-(
-
你知道你要连接的服务器的域名吗?如果是这样,那么这就是我将用作
gethostbyname()的参数