一, socket服务端和客户的通信流程
二,分析代码的实现
1,这边我说的转换网络的ip地址其实是01010的数字封装在网络层的
- int inet_pton(int af, const char *src, void *dst); // 转换网络的ip地址
- uint32_t htonl(uint32_t hostlong); //ip地址数字转换成网络ip地址的
- uint16_t htons(uint16_t hostshort); //端口号数字转换成网络信息的端口号地址
- uint32_t ntohl(uint32_t netlong);
- uint16_t ntohs(uint16_t netshort);
代码的实现
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/stat.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <ctype.h>
#include "wrap.h"
#include <sys/wait.h>
void wait_child(void * signo)
{
while ( waitpid(0, NULL, WNOHANG) > 0);
return;
}
#define SERV_PORT 8888
int main(int argc, char *argv[])
{
//id进程
pid_t pid;
//socket的描述符
int lfd, cfd;
int i, n;
char buf[BUFSIZ], clie_IP[BUFSIZ];
struct sockaddr_in serv_addr, clie_addr;
socklen_t clie_addr_len;
//创建一个socket
lfd = Socket(AF_INET, SOCK_STREAM, 0);
bzero(&serv_addr, sizeof(serv_addr));
//初始化操作
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(SERV_PORT);
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
//固定ip地址的操作
// inet_pton(AF_INET, "127.0.0.1", serv_addr.sin_addr.s_addr);
//绑定ip地址和端口号
Bind(lfd,(struct sockaddr *) &serv_addr, sizeof(serv_addr));
//连数量
Listen(lfd, 128);
while (1)
{
clie_addr_len = sizeof(clie_addr);
cfd = Accept(lfd,(struct sockaddr *) &clie_addr, &clie_addr_len);
printf("client IP:%s, port:%d\n",
inet_ntop(AF_INET, &clie_addr.sin_addr.s_addr, clie_IP, sizeof(clie_IP)),
ntohs(clie_addr.sin_port));
//开启子 进程
pid = fork();
if (pid < 0)
{
perror("fork error");
exit(1);
}else if (pid == 0)
{
close(lfd);
break;
} else
{
//父进程的处理
close(cfd);
//注册
signal(SIGCHLD, wait_child);
}
}
if (pid == 0)
{
while (1)
{
//读取数据
n = Read(cfd, buf, sizeof(buf));
if ( n == 0) // client close
{
Close(cfd);
return 0;
} else if(n == -1)
{
//信号打断
perror("read error");
exit(1);
}
else{
for (i = 0; i < n; i++)
buf[i] = toupper(buf[i]);
write(cfd, buf, n);
printf("客户端:", buf);
}
}
}
//关闭连接
Close(lfd);
return 0;
}
三,客户端client
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/socket.h>
//socket 的结构体
#include <arpa/inet.h>
#include <ctype.h>
/**
* client 端
**/
#define SERV_IP "127.0.0.1"
#define SERV_PORT 8888
int main(int argc, char *argv[])
{
// socket 描述符
int cfd;
//服务器的ip地址
struct sockaddr_in serv_addr;
//socklen_t serv_addr_len;
//缓冲区
char buf[BUFSIZ];
//创建一个socket
cfd = socket(AF_INET, SOCK_STREAM, 0);
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(SERV_PORT);
//serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
inet_pton(AF_INET, SERV_IP, &serv_addr.sin_addr.s_addr);
//链接
connect(cfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr));
while (1)
{
//获取键盘内容
fgets(buf, sizeof(buf), stdin);
//写数据
write(cfd, buf, strlen(buf)); // fgets ---> hello \n\0
//读取服务器的数据
int n = (int)read(cfd, buf, sizeof(buf));
//strncat("服务器发送的数据:", buf, n);
//write(STDOUT_FILENO, buf, n);
printf("服务器发送的数据:%s", buf);
}
//绑定
//bind();
close(cfd);
return 0;
}
效果图