写个关于socket UDP传输的帖子,在网上找到的材料,拼凑在一起,运行在Windows VS2017中,服务器端模拟只发送的情况,具体的代码如下:
需要注意的地方:
1.收发两端可以用不同名字的socket,但收发两端要定义相同的数据结构来进行接收和发送;
2.sendto 函数和recvfrom函数在最后一个参数使用略有不同;”
3.在只编好了一端程序想进行程序输出检查时,可借助于wireshark,抓UDP包进行分析,注意数据包中数据的长度,wireshark中右侧是16进制的数,表示的是ASCII码,左侧是发送的内容,如图所示,发送的是hello world!。
发送端运行在Windows VS2017中:
发送端的逻辑:创建socket-绑定socket-发送socket
#include <stdio.h>
#include <WinSock2.h>
#include <windows.h>
#pragma comment(lib,"ws2_32.lib")
#define _WINSOCK_DEPRECATED_NO_WARNINGS
int main(int argc, char* argv)
{
WORD sockVersion = MAKEWORD(2, 2);
WSADATA data;
if (WSAStartup(sockVersion, &data) != 0)
{
return 0;
}
SOCKET sclient = socket(AF_INET, SOCK_DGRAM, 0); //创建socket
if (sclient == INVALID_SOCKET)
{
printf("invalid socket!");
return 0;
}
struct sockaddr_in serAddr;
serAddr.sin_family = AF_INET;
serAddr.sin_port = htons(9527);
serAddr.sin_addr.S_un.S_addr = inet_addr("192.168.0.100"); //发送端地址
struct sockaddr_in cliAddr;
cliAddr.sin_family = AF_INET;
cliAddr.sin_port = htons(9527);
cliAddr.sin_addr.S_un.S_addr = inet_addr("192.169.230.1"); //接收端地址
int BIND = bind(sclient, (struct sockaddr *)&serAddr, sizeof(serAddr));//绑定socket
if (BIND == SOCKET_ERROR)
{
printf("bind error!\n");
return 0;
}
while (1)
{
char SENDDATA[] = "HELLO WORLD! \n";
char * sendData = SENDDATA;
int SEND = sendto(sclient, sendData, sizeof(sendData), 0, (struct sockaddr*)&cliAddr, sizeof(cliAddr)); //发送socket
if (SEND == -1)
{
printf("send error!\n");
return 0;
}
}
closesocket(sclient);
WSACleanup();
return 0;
}
接收端运行在Windows VS2017中:
接收端的逻辑:创建socket-绑定socket-接收socket
#include <stdio.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <windows.h>
#pragma comment(lib,"ws2_32.lib")
#define _WINSOCK_DEPRECATED_NO_WARNINGS
int main(int argc, char* argr[])
{
//初始化WSA
WORD sockVersion = MAKEWORD(2, 2);
WSADATA wsaData;
if (WSAStartup(sockVersion, &wsaData) != 0)
{
return 0;
}
//创建套接字
SOCKET revsocket = socket(AF_INET, SOCK_DGRAM, 0);
if (revsocket == INVALID_SOCKET)
{
printf("socket error!");
return 0;
}
//绑定IP
struct sockaddr_in dest;
dest.sin_family = AF_INET;
dest.sin_port = htons(9257);
dest.sin_addr.S_un.S_addr = inet_addr("192.168.0.100"); //接收端的IP
struct sockaddr_in source;
source.sin_family = AF_INET;
source.sin_port = htons(9257);
source.sin_addr.S_un.S_addr = inet_addr("192.168.0.106"); //发送端的IP
int BIND = bind(revsocket, (struct sockaddr *)&dest, sizeof(dest));
if (BIND == SOCKET_ERROR)
{
printf("bind error!");
}
char revData[30];
while (1)
{
int rev;
int sourcelength = sizeof(source);
rev = recvfrom(revsocket, revData, sizeof(revData), 0, (struct sockaddr *)&source, &sourcelength); //接收socket
//printf("%d\n", sizeof(revData));
if (rev > 0)
{
printf("%s\n",revData);
}
else
{
printf("revcive error!\n");
}
}
closesocket(revsocket);
WSACleanup();
return 0;
}