socket多个客户端与服务器通信代码

2021-06-03 0 7,227 百度已收录

服务器代码

#include
#include
#include
#include
#include <arpa/inet.h>
#include
#include <sys/wait.h>
#include

// 子进程的工作函数
int working(int cfd, struct sockaddr_in *addr);
// 信号的处理函数
void recycle(int num);

int main()
{
// 1. 创建监听的套接字
int lfd = socket(AF_INET, SOCK_STREAM, 0);
if(lfd == -1)
{
perror(“socket”);
exit(0);
}
// 2. lfd绑定本地的IP和端口
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(9999); // 使用大端的端口
addr.sin_addr.s_addr = INADDR_ANY; // 这个宏的值就是0
int ret = bind(lfd, (struct sockaddr*)&addr, sizeof(addr));
if(ret == -1)
{
perror(“bind”);
exit(0);
}
// 3. 设置监听
ret = listen(lfd, 128);
if(ret == -1)
{
perror(“listen”);
exit(0);
}

// 注册信号捕捉
struct sigaction act;
act.sa_flags = 0;
act.sa_handler = recycle;
sigemptyset(&act.sa_mask);
sigaction(SIGCHLD, &act, NULL);

// 4. 等待并接受连接
struct sockaddr_in cliaddr;
int clilen = sizeof(cliaddr);
// 接收多客户端连接
while(1)
{
// 父进程两个任务:
// 1. 等待并接受客户端的连接
// 2. 回收子进程 -> 信号 -> 优先级高 -> 终端程序的执行流程
printf(“等待客户端的连接…\n”);
// 当进程阻塞在accept上的时候, 突然别信号终端, 进程终止当前的动作
// 当前进程去处理对应的信号的动作, 当处理完毕之后, 回到被信号终端的位置
// 如果原来是阻塞的状态, 再次回到这个位置的时候就不阻塞了, 直接返回-1
// 打印的信息: accept: Interrupted system call
int cfd = accept(lfd, (struct sockaddr*)&cliaddr, &clilen);
if(cfd == -1)
{
if(errno == EINTR)
{
continue;
}
perror(“accept”);
exit(0);
}
printf(“和客户端的连接成功建立了…\n”);
// 和建立连接的客户端通信
// 创建子进程 -> 通信
pid_t pid = fork();
if(pid > 0)
{
// father进程
// 关闭通信的文件描述符
close(cfd);
}
else if(pid == 0)
{
// 子进程 -> 通信和对应的客户端, 通过得到的cfd
// 关闭监听的fd
close(lfd);

客户端代码
#include <arpa/inet.h>

int main()
{
// 1. 创建通信的套接字
int lfd = socket(AF_INET, SOCK_STREAM, 0);
if(lfd == -1)
{
perror(“socket”);
exit(0);
}
// 2. 连接服务器使用服务器绑定的IP和端口
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(9999); // 使用大端的端口
// 点分十进制的ip字符串 -> 大端整形
inet_pton(AF_INET, “192.168.237.131”, &addr.sin_addr.s_addr);
int ret = connect(lfd, (struct sockaddr*)&addr, sizeof(addr));
if(ret == -1)
{
perror(“connect”);
exit(0);
}

// 3. 通信
int number = 0;
while(1)
{
char sendbuf[1024];
sprintf(sendbuf, “你好, 服务器 – %d\n”, number++);
// 发送数据
send(lfd, sendbuf, strlen(sendbuf)+1, 0);

// 接收数据
char buf[1024];
int len = recv(lfd, buf, sizeof(buf), 0);
if(len == 0)
{
printf(“server disconnect….\n”);
break;
}
printf(“server say: %s\n”, buf);
sleep(1);
}

close(lfd);

return 0;
}

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

点赞 (1)

全网最牛逼 C\C++ socket多个客户端与服务器通信代码 https://www.qwznb.com/856.html

相关文章

评论
暂无评论