代码拉取完成,页面将自动刷新
#include <iostream>
#include <cstdlib>
#include <unistd.h>
#include <strings.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
using namespace std;
void Usage(string proc)
{
cout << "\n\rUsage: " << proc << " serverip serverport\n"
<< endl;
}
// ./udpclient serverip serverport 对应客户端姓名 服务器IP 服务器端口号
int main(int argc, char *argv[])
{ //提醒用户输入3个相应数据
if (argc != 3)//udpclient serverip serverport共3个数据所以不收到3个数据就是出错
{
Usage(argv[0]);//argv[0]存储udpclient姓名
exit(0);
}
string serverip = argv[1];
uint16_t serverport = stoi(argv[2]);
//定义server结构体用于存储与 IPv4 地址相关的网络信息。
struct sockaddr_in server;
//将server内存区域清零,即将这段内存区域中sizeof(server)个字节都设置为0。
bzero(&server, sizeof(server));
// 配置协议族,在socket编程中只能是AF_INET
server.sin_family = AF_INET; //选择AF_INET 的目的就是使用IPv4 进行通信。
//配置端口号(网络字节序),需要保证我的端口号是网络字节序列,因为该端口号是要给对方发送的
server.sin_port = htons(serverport);
//配置监听的IP地址,inet_addr将一个点分十进制的IP转换成一个长整型数
server.sin_addr.s_addr = inet_addr(serverip.c_str());
// socklen_t表示套接字结构体中成员参数的大小,此处计算了套接字结构体的大小
socklen_t len = sizeof(server);
//创建套接字文件sockfd(网络接口卡)
int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd < 0)
{
cout << "socker error" << endl;
return 1;
}
// client 要bind吗?要!!!只不过不需要用户显示的bind!一般有OS自由随机选择!
// 系统什么时候给我bind呢?首次发送数据的时候
// 一个端口号只能被一个进程bind,对server是如此,对于client,也是如此!
// 其实client的端口号是多少,其实不重要,只要能保证主机上的唯一性就可以!
string message;
char buffer[1024];
while (true)
{
cout << "Please Enter@ ";
getline(cin, message);//获取一行信息
// 通过网络接口卡sockfd将message中message.size个数据以常规、标准(0模式)发给长为len的server(注意强制转换)
sendto(sockfd, message.c_str(), message.size(), 0, (struct sockaddr *)&server, len);
struct sockaddr_in temp;
socklen_t len = sizeof(temp);
//通过网络接口卡sockfd从大小为len的temp以常规、标准(0模式)读取数据到大小为1023的buffer中
ssize_t s = recvfrom(sockfd, buffer, 1023, 0, (struct sockaddr*)&temp, &len);
if(s > 0)
{
buffer[s] = 0;
cout << buffer << endl;
}
}
close(sockfd);//用完关闭创建的套接字文件(网络接口卡)让其停止运行
return 0;
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。