Network:测试socket发送结构体

来源:互联网 发布:linux shell有哪几种 编辑:程序博客网 时间:2024/06/05 17:24
// SendByClient.cpp : 定义控制台应用程序的入口点。// 发送方#include "stdafx.h"#include <WinSock2.h>#include <windows.h>#pragma comment(lib,"ws2_32.lib")const int HOST_INFO_SIZE = 32;struct PACKAGE{//定义成指针就坑了,不过暂时还不知道为什么char msg[MAXBYTE];char host_name[HOST_INFO_SIZE];char host_ip[HOST_INFO_SIZE];char flag;};int _tmain(int argc, _TCHAR* argv[]){WSADATA wsaData;if (NO_ERROR != WSAStartup(MAKEWORD(2, 2), &wsaData)){printf("winsock load failed!\n");return 1;}if (2 != LOBYTE(wsaData.wVersion) || 2 != HIBYTE(wsaData.wVersion)){return 1;}printf("winsock load success.\n");sockaddr_in dest_addr = { 0 };dest_addr.sin_family = AF_INET;dest_addr.sin_port = htons(9097);dest_addr.sin_addr.s_addr = inet_addr("127.0.0.1");int dest_addr_len = sizeof(dest_addr);SOCKET send_socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);if (INVALID_SOCKET == send_socket){printf("socket init failed\n");return -1;}//用来获取主机的信息char *local_ip, *local_name;hostent *host_info = gethostbyname("");local_ip = inet_ntoa(*(in_addr*)host_info->h_addr);local_name = host_info->h_name;PACKAGE package;//构造需要发送的数据包package.flag = 'O';memcpy(package.host_ip, local_ip, sizeof(package.host_ip));memcpy(package.host_name, local_name, sizeof(package.host_name));memcpy(package.msg, "Hello", sizeof(package.msg));//把数据强转换成char流发送,接收方再次转换回来就行int ret = sendto(send_socket, (char*)&package, sizeof(PACKAGE), 0, (SOCKADDR*)&dest_addr, dest_addr_len);if (ret == SOCKET_ERROR){printf("sendto error\n");return -1;}//printf("%s\n", send_buffer);//测试输出printf("send success\ndata:\n-------------------------\n");printf("flag:%c\nmsg:%s\nname:%s\nip:%s\n", package.flag, package.host_ip, package.host_name, package.msg);system("pause");//释放资源WSACleanup();closesocket(send_socket);return 0;}
// RecvByServer.cpp : 定义控制台应用程序的入口点。// 接收方#include "stdafx.h"#include <WinSock2.h>#include <windows.h>#pragma comment(lib,"ws2_32.lib")const int HOST_INFO_SIZE = 32;struct PACKAGE{char msg[MAXBYTE];char host_name[HOST_INFO_SIZE];char host_ip[HOST_INFO_SIZE];char flag;};int main(int argc, char* argv[]){WSADATA wsaData;if (NO_ERROR != WSAStartup(MAKEWORD(2, 2), &wsaData)){printf("winsock load failed!\n");return 1;}if (2 != LOBYTE(wsaData.wVersion) || 2 != HIBYTE(wsaData.wVersion)){return 1;}printf("winsock load success.\n");//绑定在本机上的地址sockaddr_in bind_addr = { 0 };bind_addr.sin_family = AF_INET;bind_addr.sin_port = htons(9097);bind_addr.sin_addr.s_addr = INADDR_ANY;//接受用的地址,调用时会得到发送方的信息sockaddr_in client_addr = { 0 };int client_addr_len = sizeof(client_addr);SOCKET recv_sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);if (INVALID_SOCKET == recv_sock){printf("socket init failed\n");return -1;}if (SOCKET_ERROR == bind(recv_sock, (SOCKADDR*)&bind_addr, sizeof(bind_addr))){printf("bind failed\n");return -1;}printf("bind success.\n");char *recv_buffer = new char[sizeof(PACKAGE)];printf("wait for recv...\n");int ret = recvfrom(recv_sock, recv_buffer, sizeof(PACKAGE), 0, (SOCKADDR*)&client_addr, &client_addr_len);if(ret == SOCKET_ERROR){printf("recvfrom error,Error code:%d\n",WSAGetLastError());return -1;}//printf("recv %s\n", recv_buffer);//还原回来PACKAGE package;//方法一//memcpy(&package, recv_buffer, ret);//方法二package = *(PACKAGE*)recv_buffer;printf("recv data size:%d\n", ret);//查看测试结果printf("flag:%c\nmsg:%s\nname:%s\nip:%s\n", package.flag,package.host_ip,package.host_name,package.msg);//释放资源delete[] recv_buffer;WSACleanup();closesocket(recv_sock);system("pause");return 0;}


0 0