服务器端
#include <cstdio>
#include<arpa/inet.h>
#include<iostream>
#include<unistd.h>
using namespace std;
int main()
{
printf("%s 向你问好!\n", "SocketLinnx");
//1.创建监听的套接字
int fd = socket(AF_INET, SOCK_STREAM, 0);
if (fd == -1)
{
perror("socket");
return -1;
}
//2.绑定本地端口
//2.1 addr结构体的初始化和地址
sockaddr_in saddr;
saddr.sin_family = AF_INET;
saddr.sin_port = htons(9999);
saddr.sin_addr.s_addr = INADDR_ANY;//指定为0后,自动读取实际ip
int ret = bind(fd,(sockaddr *) &saddr, sizeof(saddr));
if (ret == -1)
{
perror("bind");
return -1;
}
//3.设置监听
ret = listen(fd, 128);
if (ret == -1)
{
perror("bind");
return -1;
}
//4.阻塞并等待客户端连接
struct sockaddr_in caddr;
int addrlen = sizeof(caddr);
int cfd = accept(fd, (struct sockaddr*)&caddr, (socklen_t*)& addrlen);
if (cfd == -1)
{
perror("accept");
return -1;
}
//建立连接成功,打印客户端IP和端口
//caddr是大端信息,需要转成小端输出
char ip[32];
printf("客户端IP:%s ,端口:&d\n", inet_ntop(AF_INET,&caddr.sin_addr.s_addr,ip,sizeof(ip)),ntohs(caddr.sin_port));
//5.进行通信
while (true)
{
//接收数据
char buff[1024];
int len = recv(cfd, buff, sizeof(buff), 0);
if (len > 0)
{
cout << buff << endl;
send(cfd, buff, len, 0);
}
else if (len == 0)
{
cout << "客户端断开连接" << endl;
break;
}
else {
perror("recv");
break;
}
}
//释放文件描述符
close(cfd);
close(fd);
return 0;
}
客户端(由于接口不同,部分函数不同)
#include<iostream>
#include<WinSock2.h>
#include<WS2tcpip.h>
using namespace std;
int main()
{
// 初始化套接字库
WSAData wsa;
WSAStartup(MAKEWORD(2, 2), &wsa);
//1.创建通信的套接字
SOCKET fd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
if (fd == -1)
{
perror("socket");
return -1;
}
//2.连接服务器
sockaddr_in saddr;
saddr.sin_family = AF_INET;
saddr.sin_port = htons(9999);
inet_pton(AF_INET, "120.79.224.46", &saddr.sin_addr.s_addr);
//saddr.sin_addr.s_addr = inet_addr("120.79.224.46");//指定为0后,自动读取实际ip
int ret = connect(fd,(sockaddr*)&saddr,sizeof(saddr));
if (ret == -1)
{
perror("connect");
return -1;
}
//5.进行通信
int number = 0;
while (true)
{
//发送数据
char buff[1024];
sprintf_s(buff, "cnsm,服务器,NUM: %d...\n", number++);
send(fd, buff, strlen(buff)+1, 0);
//接收数据
memset(buff, 0, sizeof(buff));
int len = recv(fd, buff, sizeof(buff), 0);
if (len > 0)
{
cout << "server says: " << buff << endl;
}
else if (len == 0)
{
cout << "server close" << endl;
}
else
{
perror("recv");
break;
}
Sleep(1);
}
//释放文件描述符
WSACleanup();
closesocket(fd);
return 0;
}