#include "stdafx.h"
#include<winsock2.h>
#include<stdio.h>
#include<string.h>
#include<iostream>
#include <Ws2tcpip.h>
#include<WinSock2.h>
using namespace std;
#pragma comment(lib,"ws2_32.lib")
# define BUFFER_SIZE 10240 //缓冲区大小
int main() {
SOCKET sock_Client; //客户端用于通信的Socket
WSADATA WSAData;
char receBuf[BUFFER_SIZE]; //发送数据的缓冲区
char sendBuf[BUFFER_SIZE]; //接受数据的缓冲区
if (WSAStartup(MAKEWORD(2,2), &WSAData) != 0) {
printf("初始化失败!");
return -1;
}
/*if (LOBYTE(WSAData.wVersion) != 1 || HIBYTE(WSAData.wVersion) != 1) {
WSACleanup();
return -1;
}*/
//初始化
//sock_Client = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);//创建客户端用于通信的Socket
SOCKADDR_IN addr_server; //服务器的地址数据结构
addr_server.sin_family = AF_INET;
addr_server.sin_port = htons(15533);//端口号
addr_server.sin_addr.S_un.S_addr = inet_addr("192.168.0.2"); //192.168.0.3为本电脑IP地址
//addr_server.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
sock_Client = socket(AF_INET, SOCK_DGRAM, 0);
;
if (sock_Client == INVALID_SOCKET)
{
printf("socket()failed:%d
", WSAGetLastError());
return -1;
}
int iLen = sizeof(addr_server);
sockaddr fromAddr;
int addrLen = sizeof(fromAddr);
while (1)
{
//printf("请输入传送的数据:");
//gets(sendBuf);
cout << "请输入要传送的数据:";
cin >> sendBuf;
int last = sendto(sock_Client, sendBuf, strlen(sendBuf), 0, (SOCKADDR*)&addr_server,iLen);
if (last == SOCKET_ERROR)
{
printf("socket()failed:%d
", WSAGetLastError());
return -1;
}
else if (last == 0)
{
return -1;
}
else
{
printf("sendto()succeeded.
");
}
//receBuf[BUFFER_SIZE] = { 0 };
memset(receBuf, 0, BUFFER_SIZE);
int strLen = recvfrom(sock_Client, receBuf, BUFFER_SIZE, 0, &fromAddr, &addrLen);
if (strLen > 0) {
receBuf[strLen]= ' '; //给字符数组加一个' ',表示结束了。不然输出有乱码
printf("接收到数据:
");
for (int i=0;i < strLen; i++)
{
printf("%02x ",receBuf[i]&0xff);
if ((i + 1) % 4 == 0)
{
printf("
");
}
}
}
else
{
printf("未接收到数据
");
}
}
closesocket(sock_Client);
WSACleanup();
return 0;
}
/*
sockaddr和sockaddr_in的区别:
sockaddr常用于bind、connect、recvfrom、sendto等函数的参数,指明地址信息。是一种通用的套接字地址。
而sockaddr_in 是internet环境下套接字的地址形式。
所以在网络编程中我们会对sockaddr_in结构体进行操作。
使用sockaddr_in来建立所需的信息,最后使用类型转化就可以了。
服务器端比较常见,点对点的接收只接收特定端口和IP的数据,当接收到指定客户端的数据时做相应的响应,发数据给客户端。
*/