先看效果
客户端发送
服务端接收
流程
客户端源码
连接成功后,可通过键盘输入内容发送到服务端。
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#define HOST "127.0.0.1" // 服务器地址
#define PORT 8888 // 端口
int main ()
{
int sockfd;
int ret;
uint8_t buf[100];
struct sockaddr_in server;
// 创建TCP Socket
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd == -1)
{
printf("fail to creat socket.\r\n");
exit(EXIT_FAILURE);
}
// 设置地址与端口到结构体
memset(&server, 0,sizeof(server));
server.sin_family = AF_INET; // IPV4
server.sin_port = htons(PORT);
server.sin_addr.s_addr = inet_addr(HOST);
// 建立TCP连接
ret = connect(sockfd, (struct sockaddr *)&server, sizeof(struct sockaddr));
if (ret == -1)
{
close(sockfd);
printf("Fail to connect server.\r\n");
exit(EXIT_FAILURE);
}
printf("Connect %s:%d success.\r\n", HOST, PORT);
while (1)
{
printf("Please enter the content to be sent:\r\n");
// 从标准输入 stdin 读取一行
gets(buf);
// 非阻塞发送
ret = send(sockfd, buf, strlen(buf), MSG_DONTWAIT);
if (ret == -1)
{
close(sockfd);
printf("send err.\r\n");
break;
}
printf("ret = %d\r\n", ret);
}
return 0;
}
服务端源码
每次可运行一个客户端连接,并将接收到的内容打印出来。
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <errno.h>
#include <arpa/inet.h>
#define HOST "127.0.0.1" // 本机地址
#define PORT 8888 // 端口
int main ()
{
int sockfd, clinet_fd;
int ret;
uint8_t buf[100];
struct sockaddr_in server, peer_addr;
socklen_t peerlen;
peerlen = (socklen_t)sizeof(struct sockaddr);
// 创建TCP Socket
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd == -1)
{
printf("fail to creat socket.\r\n");
exit(EXIT_FAILURE);
}
// 设置地址与端口到结构体
memset(&server, 0,sizeof(server));
server.sin_family = AF_INET; // IPV4
server.sin_port = htons(PORT);
server.sin_addr.s_addr = inet_addr(HOST);
// 绑定地址与端口信息
ret = bind(sockfd, (struct sockaddr *)&server, sizeof(struct sockaddr));
if (ret == -1)
{
close(sockfd);
printf("Fail to bind information.\r\n");
exit(EXIT_FAILURE);
}
ret = listen(sockfd, 1);
if (ret == -1)
{
close(sockfd);
printf("Fail to listen.\r\n");
exit(EXIT_FAILURE);
}
while (1)
{
// 阻塞等待接入请求
clinet_fd = accept(sockfd, (struct sockaddr *)&peer_addr, &peerlen);
if (clinet_fd == -1)
{
close(sockfd);
printf("Fail to accept.\r\n");
exit(EXIT_FAILURE);
}
while (1)
{
memset(buf, 0, 100);
// 阻塞接收数据
ret = recv(clinet_fd, buf, 100, 0);
if (ret > 0)
{
printf("%s:%d[%d]: %s\r\n", inet_ntoa(peer_addr.sin_addr), htons(peer_addr.sin_port), ret, buf);
}
else if (ret == 0)
{
close(clinet_fd);
break;
}
else
{
if(errno != EINTR && errno != EWOULDBLOCK && errno != EAGAIN)
{
close(clinet_fd);
break;
}
}
}
}
return 0;
}