目录
1.TCP服务器
#include <arpa/inet.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <unistd.h>
// 服务器端口号
#define POST 1210
// 服务器ip
#define IP "192.168.71.29"
int main(int argc, const char* argv[])
{
// 1.创建套接字
int skfd = socket(AF_INET, SOCK_STREAM, 0);
if (-1 == skfd) {
perror("socket");
return -1;
}
// 2.设置服务器端口号快速重用
int reuse = 1;
if (-1 == setsockopt(skfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse))) {
perror("setsockopt");
return -1;
}
// 3.设置服务器地址信息结构体
struct sockaddr_in saddr;
saddr.sin_family = AF_INET;
saddr.sin_port = htons(POST); // 服务器端口号, 将本地字节序转网络字节序
saddr.sin_addr.s_addr = inet_addr(IP); // 服务器IP, 将本地字节序转网络字节序
// 4.绑定服务器端口和ip
if (-1 == bind(skfd, (struct sockaddr*)&saddr, sizeof(saddr))) {
perror("bind");
return -1;
}
// 5.设置套接字为监听模式
if (-1 == listen(skfd, 10)) {
perror("listen");
return -1;
}
// 6.定义存储成功连接的客户端地址信息
struct sockaddr_in newaddr;
socklen_t size = sizeof(newaddr);
// 7.获取新套接字
int newfd = accept(skfd, (struct sockaddr*)&newaddr, &size);
if (-1 == newfd) {
perror("accept");
return -1;
}
char buf[128] = ""; // 存储接收发送的信息
ssize_t buf_t = 0; // 保存每次接收到数据大小
// 8.接收/发送
while (1) {
bzero(buf, sizeof(buf));
// 接收
buf_t = recv(newfd, buf, sizeof(buf), 0);
if (-1 == buf_t) {
perror("recv");
return -1;
} else if (0 == buf_t || strcasecmp(buf, "quit") == 0) {
printf("[%s][%d]客户端退出\n", inet_ntoa(newaddr.sin_addr), ntohs(newaddr.sin_port));
break;
}
printf("[%s][%d]buf=%s\n", inet_ntoa(newaddr.sin_addr), ntohs(newaddr.sin_port), buf);
// 发送
strcat(buf, "*_*");
if (-1 == send(newfd, buf, strlen(buf), 0)) {
perror("send");
return -1;
}
}
// 9.关闭套接字
close(newfd);
close(skfd);
return 0;
}
2.TCP客户端
#include <arpa/inet.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <unistd.h>
// 服务器端口号
#define POST 1210
// 服务器ip
#define IP "192.168.71.29"
int main(int argc, const char* argv[])
{
// 1.创建套接字
int skfd = socket(AF_INET, SOCK_STREAM, 0);
if (-1 == skfd) {
perror("socket");
return -1;
}
// 2.设置服务器地址信息结构体
struct sockaddr_in saddr;
saddr.sin_family = AF_INET;
saddr.sin_port = htons(POST); // 服务器端口号, 将本地字节序转网络字节序
saddr.sin_addr.s_addr = inet_addr(IP); // 服务器IP, 将本地字节序转网络字节序
// 3.获取新套接字
if (-1 == connect(skfd, (struct sockaddr*)&saddr, sizeof(saddr))) {
perror("connect");
return -1;
}
char buf[128] = ""; // 存储接收发送的信息
ssize_t buf_t = 0; // 保存每次接收到数据大小
// 4.接收/发送
while (1) {
// 发送
printf("input:");
fgets(buf, sizeof(buf), stdin);
buf[strlen(buf) - 1] = '\0';
if (-1 == send(skfd, buf, strlen(buf), 0)) {
perror("send");
return -1;
}
bzero(buf, sizeof(buf));
// 接收
buf_t = recv(skfd, buf, sizeof(buf), 0);
if (-1 == buf_t) {
perror("recv");
return -1;
} else if (0 == buf_t || strcasecmp(buf, "quit") == 0) {
printf("[%s][%d]客户端退出\n", inet_ntoa(saddr.sin_addr), ntohs(saddr.sin_port));
break;
}
printf("[%s][%d]buf=%s\n", inet_ntoa(saddr.sin_addr), ntohs(saddr.sin_port), buf);
}
// 5.关闭套接字
close(skfd);
return 0;
}
3.UDP服务器
// 服务器端
#include <arpa/inet.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <unistd.h>
// 服务器端口号
#define POST 1116
// 服务器ip
#define IP "192.168.2.146"
int main(int argc, const char* argv[])
{
// 1.创建报式套接字
int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (-1 == sockfd) {
perror("socket");
return -1;
}
// 2.定义服务器地址信息结构体
struct sockaddr_in addr;
addr.sin_family = AF_INET; // 地址簇
addr.sin_port = htons(POST); // 服务器端口号, 需要本地字节序-->网络字节序
addr.sin_addr.s_addr = inet_addr(IP); // 服务器ip, 需要点分十进制-->网络字节序
// 3.绑定服务器ip/端口号
if (-1 == bind(sockfd, (struct sockaddr*)&addr, sizeof(addr))) {
perror("bind");
return -1;
}
char buf[128] = ""; // 定义保存接收到的数据
ssize_t size = 0; // 保存每次接收到数据的大小
struct sockaddr_in Caddr;
socklen_t Caddr_len = sizeof(Caddr);
while (1) {
// 清空buf
bzero(buf, sizeof(buf));
// 3.接收数据
size = recvfrom(sockfd, buf, sizeof(buf), 0, (struct sockaddr*)&Caddr, &Caddr_len);
if (-1 == size) {
perror("recvfrom");
return -1;
}
if (strcasecmp(buf, "quit") == 0) {
printf("[%s][%d]客户端下线\n", inet_ntoa(Caddr.sin_addr), ntohs(Caddr.sin_port));
break;
}
printf("[%s][%d]buf=%s\n", inet_ntoa(Caddr.sin_addr), ntohs(Caddr.sin_port), buf);
// 4.发送数据
strcat(buf, "*_*");
if (-1 == sendto(sockfd, buf, strlen(buf), 0, (struct sockaddr*)&Caddr, sizeof(Caddr))) {
perror("sendto");
return -1;
}
}
// 5.关闭套接字
close(sockfd);
printf("服务器退出\n");
return 0;
}
4.UDP客户端
// 客户端
#include <arpa/inet.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <unistd.h>
// 服务器端口号
#define POST 1116
// 服务器ip
#define IP "192.168.2.146"
int main(int argc, const char* argv[])
{
// 1.创建报式套接字
int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (-1 == sockfd) {
perror("socket");
return -1;
}
// 2.定义服务器地址信息结构体
struct sockaddr_in addr;
addr.sin_family = AF_INET; // 地址簇
addr.sin_port = htons(POST); // 服务器端口号, 需要本地字节序-->网络字节序
addr.sin_addr.s_addr = inet_addr(IP); // 服务器ip, 需要点分十进制-->网络字节序
// // 3.绑定服务器ip/端口号
// if (-1 == bind(sockfd, (struct sockaddr*)&addr, sizeof(addr))) {
// perror("bind");
// return -1;
// }
char buf[128] = ""; // 定义保存接收到的数据
ssize_t size = 0; // 保存每次接收到数据的大小
socklen_t addr_len = sizeof(addr);
while (1) {
// 3.发送数据
fgets(buf, sizeof(buf), stdin);
buf[strlen(buf) - 1] = '\0';
if (-1 == sendto(sockfd, buf, strlen(buf), 0, (struct sockaddr*)&addr, sizeof(addr))) {
perror("sendto");
return -1;
}
if (strcasecmp(buf, "quit") == 0) {
break;
}
// 清空buf
bzero(buf, sizeof(buf));
// 4.接收数据
size = recvfrom(sockfd, buf, sizeof(buf), 0, (struct sockaddr*)&addr, &addr_len);
if (-1 == size) {
perror("recvfrom");
return -1;
}
printf("[%s][%d]buf=%s\n", inet_ntoa(addr.sin_addr), ntohs(addr.sin_port), buf);
}
// 5.关闭套接字
close(sockfd);
return 0;
}