基于UDP传输的socket网络通信

熠熠微光 2018-11-13 10:15:27
楼主CS专业大三在读生,网络的一个作业就是制作一个简单的 基于UDP传输的socket网络通信

我其实都不是太懂= =反正自己做好后客户端报错10022,服务器端报错10047

请求各位大侠帮忙~

服务器端:

  #include <winsock2.h>
#pragma comment(lib,"WS2_32.lib")
#define CLIENT_IP "127.0.0.1" // 客户端地址
#define CLIENT_PORT 5260 // 客户端端口
#include <stdio.h>
int main()
{
int iPort = CLIENT_PORT;
WSADATA wsaData;
SOCKET sRecvfrom; //sRecvfrom为服务器端套接口
int iLen; //客户地址长度
int iSend;//发送数据长度
char buf[] = "I am a server";//要发送给客户的信息
struct sockaddr_in ser,cli;//服务器和客户的地址
int cli_len = sizeof(struct sockaddr_in);
if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0)//判断协议栈是否正确安装
{
printf("Failed to load Winsock.\n");
return -1;
}
sRecvfrom = socket(AF_INET,SOCK_DGRAM,0);//创建服务器端套接口
if(sRecvfrom == INVALID_SOCKET)
{
printf("socket() Failed: %d\n",WSAGetLastError());
return -1;
}
//以下建立服务器端地址
//使用IP地址族
ser.sin_family = AF_INET;
//使用htons()把双字节主机序端口号转换为网络字节序端口号
ser.sin_port = htons(iPort);
//htonl()把一个四字节主机序IP地址转换为网络字节序主机地址
//使用系统指定的IP地址INADDR_ANY
ser.sin_addr.s_addr = htonl(INADDR_ANY);
//bind()函数进行套接字与地址的绑定
if(bind(sRecvfrom,(LPSOCKADDR)&ser,sizeof(ser)) == SOCKET_ERROR)
{
printf("bind() Failed: %d\n",WSAGetLastError());
return -1;
}
//初始化客户地址长度参数
iLen = sizeof(cli);
//进入一个无限循环
while(1)
{
//给连接的客户发送信息
iSend = sendto(sRecvfrom,buf,sizeof(buf),0,(struct sockaddr *)&cli, cli_len);
if(iSend == SOCKET_ERROR)
{
printf("send() Failed: %d\n",WSAGetLastError());
break;
}
else if(iSend == 0)
{
break;
}
else
{
printf("send() byte: %d\n",iSend);//发送字节数
}
closesocket(sRecvfrom);//关闭客户端套接字
}
WSACleanup();//中止了Windows Sockets在所有线程上的操作,释放资源
return 0;

}



客户端:
  #include <Winsock2.h>
#pragma comment(lib,"WS2_32.lib")
#include <stdio.h>
#include <stdlib.h>
#define SERVER_IP "127.0.0.1" // 服务器端IP地址
#define SERVER_PORT 5260 // 服务器端口号
#define DATA_BUFFER 1024 //默认缓冲区大小
int main()
{
WSADATA wsaData;
SOCKET sClient;
int iPort = SERVER_PORT;
int iLen;//从服务器端接收的数据长度
char buf[DATA_BUFFER];//接收数据的缓冲区
struct sockaddr_in ser;//服务器端地址
int ser_len = sizeof(struct sockaddr_in);
//判断参数输入是否正确:client [Server IP]

memset(buf,0,sizeof(buf));//接收缓冲区初始化
//判断协议栈是否正确安装
if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0)
{
printf("Failed to load Winsock.\n");
return -1;
}
//填写要连接的服务器地址信息
ser.sin_family = AF_INET; // 默认
ser.sin_port = htons(iPort); // 端口号 htons是由主机字节序转换为网络字节序
//inet_addr()将命令行中输入的点分IP地址转换为二进制表示的网络字节序IP地址
ser.sin_addr.s_addr = inet_addr(SERVER_IP);
//建立客户端流式套接口
sClient = socket(AF_INET,SOCK_DGRAM,0);
if(sClient == INVALID_SOCKET)
{
printf("socket() Failed: %d\n",WSAGetLastError());
return -1;
}

{
//从服务器端接收数据
iLen = recvfrom(sClient,buf,sizeof(buf),0, (struct sockaddr *)&ser,&ser_len);
if(iLen == 0)
return -1;
else if(iLen == SOCKET_ERROR)
{
printf("recvfrom() Failed: %d\n",WSAGetLastError());
return -1;
}
else
printf("recvfrom() data from server: %s\n",buf);
}
closesocket(sClient);//关闭客户器端套接字
WSACleanup();//中止了Windows Sockets在所有线程上的操作,释放资源
return 0;
}
...全文
77 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
轻箬笠 2018-11-14
  • 打赏
  • 举报
回复
楼上是楼主的老师吗?或者学长?
熠熠微光 2018-11-14
  • 打赏
  • 举报
回复
引用 3 楼 Slzde_sub 的回复:
给你一个参考例子。

udp 单播 server 我写来发发数据的


代码我就不看了,你可以参考一下





谢谢你呀~
熠熠微光 2018-11-14
  • 打赏
  • 举报
回复
引用 2 楼 housecarl 的回复:
楼上是楼主的老师吗?或者学长?


不是的23333333
熠熠微光 2018-11-14
  • 打赏
  • 举报
回复
引用 1 楼 ltuse_csdn 的回复:
大山中学的?


不是的=。= 我在南京上大学
凉亭_pavilion 2018-11-13
  • 打赏
  • 举报
回复
大山中学的?

64,646

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧