1. 借助服务器实现小写转大写的程序:
客户端:发送任意小写字母到服务器端。
服务器端:接收小写字母,转为大写,回传给客户端,然后客户端显示到屏幕。
#include <stdio.h> #include <unistd.h> #include <sys/socket.h> #include <stdlib.h> #include <arpa/inet.h> //结构体struct sockaddr_in的头文件 #include <ctype.h> //toupper()函数头文件 #define SERV_IP "127.0.0.1" //IP地址 #define SERV_PORT 6666 //端口号不能大于65535,1000以下的端口号一般给系统使用,用户使用端口号一般从3000以上 int main(void) { int lfd, cfd; struct sockaddr_in serv_addr, clie_addr; socklen_t clie_addr_len; char buf[BUFSIZ];//操作系统内嵌的宏BUFSIZ,指定buf大小 int n, i; lfd = socket(AF_INET, SOCK_STREAM, 0); //初始化结构体 serv_addr.sin_family = AF_INET; //ipv4 serv_addr.sin_port = htons(SERV_PORT); //htons端口号转化(本地host转为网络network) serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); //htonl IP地址转化(本地host转为网络network) INADDR_ANY表示本地有效任意IP(直接就是数值类型) bind(lfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)); listen(lfd, 128);//同时允许128个客户端向我发起连接(默认值为128,最大上限就是128) clie_addr_len = sizeof(clie_addr);//求出客户端clie_addr结构体(IP、端口)的长度 cfd = accept(lfd, (struct sockaddr *)&clie_addr, &clie_addr_len);//阻塞等待 while (1) { n = read(cfd, buf, sizeof(buf));//n为实际读到的字节 for (i = 0; i < n; i++) buf[i] = toupper(buf[i]); //小写转为大写 write(cfd, buf, n); } close(lfd);//关闭文件描述符 close(cfd); return 0; }
开启两个终端,终端1编译并执行服务端程序:
此时服务器程序运行到accept(),并阻塞等待。
终端2执行:
nc命令中,n代表Network,c代表Connect <nc简称“脑残”>
常用nc来测试服务端程序。