1. 藉助服務器實現小寫轉大寫的程序:服務器
客戶端:發送任意小寫字母到服務器端。網絡
服務器端:接收小寫字母,轉爲大寫,回傳給客戶端,而後客戶端顯示到屏幕。socket
#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執行:spa
nc命令中,n表明Network,c表明Connect <nc簡稱「腦殘」>操作系統
經常使用nc來測試服務端程序。3d