基於UDP的IP對IP的客戶端程序
#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\n", 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\n", WSAGetLastError());
return -1;
}
else if (last == 0)
{
return -1;
}
else
{
printf("sendto()succeeded.\n");
}
//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]= ‘\0‘; //給字符數組加一個‘\0‘,表示結束了。不然輸出有亂碼
printf("接收到數據:\n");
for (int i=0;i < strLen; i++)
{
printf("%02x ",receBuf[i]&0xff);
if ((i + 1) % 4 == 0)
{
printf("\n");
}
}
}
else
{
printf("未接收到數據\n");
}
}
closesocket(sock_Client);
WSACleanup();
return 0;
}
/*
sockaddr和sockaddr_in的區別:
sockaddr常用於bind、connect、recvfrom、sendto等函數的參數,指明地址信息。是一種通用的套接字地址。
而sockaddr_in 是internet環境下套接字的地址形式。
所以在網絡編程中我們會對sockaddr_in結構體進行操作。
使用sockaddr_in來建立所需的信息,最後使用類型轉化就可以了。
服務器端比較常見,點對點的接收只接收特定端口和IP的數據,當接收到指定客戶端的數據時做相應的響應,發數據給客戶端。
*/
基於UDP的IP對IP的客戶端程序