vc获取本地IP

#include<stdio.h>
#include<winsock2.h>
#pragma comment(lib,"ws2_32.lib")
void getLocalIp(void)
{
	WSADATA wsaData;
	char name[155];
	if ( WSAStartup( MAKEWORD(2,0), &wsaData ) == 0 )
	{
		if(gethostname(name,sizeof(name)) == 0)
		{
			printf("%s\n",name);
			struct hostent* phe = gethostbyname(name);
			if (0 == phe)
			{
				return;
			}
			for (int i = 0; phe->h_addr_list[i] != 0; ++i)
			{
				struct in_addr addr;
				memcpy(&addr, phe->h_addr_list[i], sizeof(struct in_addr));
				printf("IP %d:%s\n",i+1,inet_ntoa(addr));
			}
		} 
		WSACleanup( );
	}
}
int main(void)
{
	getLocalIp();
	return 0;
}



WSADATA wsdData; //这个结构被用来存储 被WSAStartup函数调用后返回的 Windows Sockets数据。它包含Winsock.dll执行的数据。
struct hostent *hn;hostent是host entry的缩写,该结构记录主机的信息,包括主机名、别名、地址类型、地址长度和地址列表。之所以主机的地址是一个列表的形式,原因是当一个主机有多个网络接口时,自然有多个地址。
char HostName[255] = {0};
WSAStartup(MAKEWORD(2,0),&wsdData);WSAStarup,是Windows SocKNDs Asynchronous的启动命令、Windows下的网络编程接口软件 Winsock1 或 Winsock2 里面的一个命令。
gethostname(HostName, sizeof(HostName));//int PASCAL FAR gethostname(char FAR *name, int namelen);
printf("%s\n",HostName);
hn = gethostbyname(HostName);//gethostbyname()返回对应于给定主机名的包含主机名字和地址信息的hostent结构指针。结构的声明与gethostaddr()中一致。
printf("%s\n",inet_ntoa(*(struct in_addr *)hn->h_addr_list[0]));//将一个IP转换成一个互联网标准点分格式的字符串。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这是一个很好的毕设主题。下面是一个基于TCP/IP的文件传输的简单设计和实现建议,使用VC代码实现: 1. 建立客户端和服务器端的TCP连接。 2. 客户端选择要传输的文件并将其读取到内存中。 3. 客户端将文件大小发送给服务器端。 4. 服务器端接收到文件大小后,分配一个缓冲区来存储接收到的文件。 5. 服务器端发送一个确认消息给客户端,表示已经准备好接收文件。 6. 客户端开始将文件数据分成固定大小的块,并将每个块发送给服务器端。 7. 服务器端接收每个块,并将其存储到缓冲区中。 8. 当客户端发送完整个文件后,它会发送一个文件传输完成的消息给服务器端。 9. 服务器端接收到文件传输完成的消息后,将缓冲区中的数据写入磁盘中,并发送一个确认消息给客户端,表示文件传输完毕。 10. 客户端接收到确认消息后,断开TCP连接。 这是一个基本的文件传输协议的设计和实现,您可以根据需要进行修改和扩展。以下是一个简单的VC代码示例,实现上述协议: ```c++ #include <stdio.h> #include <winsock2.h> #pragma comment(lib,"ws2_32.lib") //Winsock Library #define BUF_SIZE 1024 int main(int argc, char* argv[]) { WSADATA wsa; SOCKET s, new_socket; struct sockaddr_in server, client; int c; char* message; char buffer[BUF_SIZE]; int recv_size; FILE* fp; long file_size; long remain_size; long read_size; long write_size; char filename[BUF_SIZE]; printf("\nInitialising Winsock..."); if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0) { printf("Failed. Error Code : %d", WSAGetLastError()); 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()); } printf("Socket created.\n"); //Prepare the sockaddr_in structure server.sin_family = AF_INET; server.sin_addr.s_addr = INADDR_ANY; server.sin_port = htons(8888); //Bind if (bind(s, (struct sockaddr*)&server, sizeof(server)) == SOCKET_ERROR) { printf("Bind failed with error code : %d", WSAGetLastError()); exit(EXIT_FAILURE); } puts("Bind done"); //Listen to incoming connections listen(s, 3); //Accept and incoming connection puts("Waiting for incoming connections..."); c = sizeof(struct sockaddr_in); new_socket = accept(s, (struct sockaddr*)&client, &c); if (new_socket == INVALID_SOCKET) { printf("accept failed with error code : %d", WSAGetLastError()); return 1; } puts("Connection accepted"); //Receive file size memset(buffer, 0, BUF_SIZE); recv_size = recv(new_socket, buffer, BUF_SIZE, 0); file_size = *(long*)buffer; printf("File size: %ld\n", file_size); //Receive file name memset(buffer, 0, BUF_SIZE); recv_size = recv(new_socket, buffer, BUF_SIZE, 0); strcpy(filename, buffer); printf("File name: %s\n", filename); //Open file fp = fopen(filename, "wb+"); if (fp == NULL) { printf("Could not open file %s", filename); exit(EXIT_FAILURE); } //Receive file data remain_size = file_size; while (remain_size > 0) { read_size = BUF_SIZE; if (remain_size < BUF_SIZE) { read_size = remain_size; } memset(buffer, 0, BUF_SIZE); recv_size = recv(new_socket, buffer, read_size, 0); write_size = fwrite(buffer, 1, recv_size, fp); if (write_size != recv_size) { printf("Could not write to file %s", filename); exit(EXIT_FAILURE); } remain_size -= write_size; } printf("File received: %s\n", filename); //Send confirmation message = "File received"; send(new_socket, message, strlen(message), 0); //Close socket and file fclose(fp); closesocket(new_socket); closesocket(s); WSACleanup(); return 0; } ``` 以上代码只是服务器端的实现,客户端的实现类似,但需要从本地读取文件并将其分块发送给服务器端。您可以使用此代码作为参考,进行必要的修改和扩展,以实现您的毕设要求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值