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#include #include #include #include #include #include #include #include "wrap.h" #include 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; }
#include#include #include #include #include #include #include //socket 的结构体 #include #include /** * 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; }
效果图