????????TCP和UDP均采用自己电脑,既做服务器端又做客户端,当然Xcode无法同时运行两个Target,所以可以选择一个在终端,一个在Xcode,或者两个都在终端。
TCP服务器端:
#include<iostream>
#include<unistd.h>
#include<stdio.h>
#include<string.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
using namespace std;
#define SERVER_PORT 5050 //端口号
#define SERVER_IP "127.0.0.1" //服务器ip
#define QUEUE_SIZE 5 //所监听端口队列大小
int main(int argc, char *argv[])
{
//创建一个套接字,并检测是否创建成功
int sockSer;
sockSer = socket(AF_INET, SOCK_STREAM, 0);
if(sockSer == -1){
perror("socket");
}
//设置端口可以重用,可以多个客户端连接同一个端口,并检测是否设置成功
int yes = 1;
if(setsockopt(sockSer, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) == -1){
perror("setsockopt");
}
struct sockaddr_in addrSer,addrCli; //创建一个记录地址信息的结构体
addrSer.sin_family = AF_INET; //所使用AF_INET协议族
addrSer.sin_port = htons(SERVER_PORT); //设置地址结构体中的端口号
addrSer.sin_addr.s_addr = inet_addr(SERVER_IP); //设置其中的服务器ip
//将套接字地址与所创建的套接字号联系起来。并检测是否绑定成功
socklen_t addrlen = sizeof(struct sockaddr);
int res = ::bind(sockSer,(struct sockaddr*)&addrSer,addrlen);
if(res == -1)
perror("bind");
listen(sockSer, QUEUE_SIZE); //监听端口队列是否由连接请求,如果有就将该端口设置位可连接状态,等待服务器接收连接
printf("Server Wait Client Accept......\n");
//如果监听到有连接请求接受连接请求。并检测是否连接成功,成功返回0,否则返回-1
int sockConn = accept(sockSer, (struct sockaddr*)&addrCli, &addrlen);
if(sockConn == -1)
perror("accept");
else
{
printf("Server Accept Client OK.\n");
printf("Client IP:> %s\n", inet_ntoa(addrCli.sin_addr));
printf("Client Port:> %d\n",ntohs(addrCli.sin_port));
}
char sendbuf[256]; //申请一个发送缓存区
char recvbuf[256]; //申请一个接收缓存区
while(1)
{
printf("Ser:>");
scanf("%s",sendbuf);
if(strncmp(sendbuf,"quit",4) == 0) //如果所要发送的数据为"quit",则直接退出。
break;
send(sockConn, sendbuf, strlen(sendbuf)+1, 0); //发送数据
recv(sockConn, recvbuf, 256, 0); //接收客户端发送的数据
printf("Cli:> %s\n",recvbuf);
}
close(sockSer); //关闭套接字
return 0;
}
TCP客户端:
#include<iostream>
#include<unistd.h>
#include<stdio.h>
#include<string.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
using namespace std;
#define SERVER_PORT 5050
#define SERVER_IP "127.0.0.1"
int main(int argc, char *argv[])
{
//创建客户端套接字号,并检测是否创建成功
int sockCli;
sockCli = socket(AF_INET, SOCK_STREAM, 0);
if(sockCli == -1)
perror("socket");
//创建一个地址信息结构体,并对其内容进行设置
struct sockaddr_in addrSer,addrCli;
addrSer.sin_family = AF_INET; //使用AF_INET协议族
addrSer.sin_port = htons(SERVER_PORT); //设置端口号
addrSer.sin_addr.s_addr = inet_addr(SERVER_IP); //设置服务器ip
bind(sockCli,(struct sockaddr*)&addrCli, sizeof(struct sockaddr)); //将套接字地址与所创建的套接字号联系起来
//创建一个与服务器的连接,并检测连接是否成功
socklen_t addrlen = sizeof(struct sockaddr);
int res = connect(sockCli,(struct sockaddr*)&addrSer, addrlen);
if(res == -1)
perror("connect");
else
printf("Client Connect Server OK.\n");
char sendbuf[256]; //申请一个发送数据缓存区
char recvbuf[256]; //申请一个接收数据缓存区
while(1)
{
recv(sockCli, recvbuf, 256, 0); //接收来自服务器的数据
printf("Ser:> %s\n",recvbuf);
printf("Cli:>");
scanf("%s",sendbuf);
if(strncmp(sendbuf,"quit", 4) == 0) //如果客户端发送的数据为"quit",则退出。
break;
send(sockCli, sendbuf, strlen(sendbuf)+1, 0); //发送数据
}
close(sockCli); //关闭套接字
return 0;
}
UDP服务器端:
#include<stdio.h>
#include<unistd.h>
#include<string.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<sys/socket.h>
int main()
{
//创建一个套接字,并检测是否创建成功
int sockSer = socket(AF_INET, SOCK_DGRAM, 0);
if(sockSer == -1)
perror("socket");
struct sockaddr_in addrSer; //创建一个记录地址信息的结构体
addrSer.sin_family = AF_INET; //使用AF_INET协议族
addrSer.sin_port = htons(5050); //设置地址结构体中的端口号
addrSer.sin_addr.s_addr = inet_addr("127.0.0.1"); //设置通信ip
//将套接字地址与所创建的套接字号联系起来,并检测是否绑定成功
socklen_t addrlen = sizeof(struct sockaddr);
int res = bind(sockSer,(struct sockaddr*)&addrSer, addrlen);
if(res == -1)
perror("bind");
char sendbuf[256]; //申请一个发送数据缓存区
char recvbuf[256]; //申请一个接收数据缓存区
struct sockaddr_in addrCli;
while(1)
{
recvfrom(sockSer,recvbuf,256,0,(struct sockaddr*)&addrCli, &addrlen); //从指定地址接收客户端数据
printf("Cli:>%s\n",recvbuf);
printf("Ser:>");
scanf("%s",sendbuf);
sendto(sockSer,sendbuf,strlen(sendbuf)+1,0,(struct sockaddr*)&addrCli, addrlen); //向客户端发送数据
}
return 0;
}
UDP客户端:
#include<stdio.h>
#include<unistd.h>
#include<string.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<sys/socket.h>
#define BUFFER_SIZE 1024
int main()
{
//创建一个套接字,并检测是否创建成功
int sockCli = socket(AF_INET, SOCK_DGRAM, 0);
if(sockCli == -1){
perror("socket");
}
struct sockaddr_in addrSer; //创建一个记录地址信息的结构体
addrSer.sin_family = AF_INET; //使用AF_INET协议族
addrSer.sin_port = htons(5050); //设置地址结构体中的端口号
addrSer.sin_addr.s_addr = inet_addr("127.0.0.1"); //设置通信ip
socklen_t addrlen = sizeof(struct sockaddr);
char sendbuf[256]; //申请一个发送数据缓存区
char recvbuf[256]; //申请一个接收数据缓存区
while(1){
//向客户端发送数据
printf("Cli:>");
scanf("%s",sendbuf);
sendto(sockCli, sendbuf, strlen(sendbuf)+1, 0, (struct sockaddr*)&addrSer, addrlen);
//接收来自客户端的数据
recvfrom(sockCli, recvbuf, BUFFER_SIZE, 0, (struct sockaddr*)&addrSer, &addrlen);
printf("Ser:>%s\n", recvbuf);
}
return 0;
}
如何在MAC终端运行.cpp文件:
1. 打开终端,输入cd 文件所在目录,是文件夹哦
用ls查看当前目录下的文件,确实有要编译的目标.cpp文件
2. 编译执行
?控制台输入以下代码,注意修改你的.cpp文件名,不要真的是main.cpp
gcc -Wall -g -o dot main.cpp
3. 回车输入
./dot
????????在没有编译错误的情况下,就可以生成dot 和 dot.dsYM文件,如上图我的那样,如果有错,说明代码有问题,或者其他问题,在CSDN上搜索? Mac如何运行C++文件,自行解决。
? ? ? ? 然后就可以享受自己和自己发消息了。
? ? ? ? 可以先运行服务器端,再运行客户端。
|