最簡單的Linux命令列Socket聊天程式原始碼
只有今天貼出程式碼,明天看才知道自己有多麼傻。
單執行緒,一對一聊天,混搭風格程式設計,函式亂入不解釋……
/* * Chat on Linux Terminal--alpha * Worte by Jimmy's [email protected] * 2011-2-23 * * This is the sorce code of client * Some BUGS still unsloved, but we are trying our best to debug * Be sure that your system's port "1234" is not busy! * * */ #include<stdio.h> #include<stdlib.h> #include<errno.h> #include<string.h> #include<netdb.h> #include<sys/types.h> #include<sys/socket.h> #include<netinet/in.h> #include<arpa/inet.h> #define SERVPORT 1234 #define MAX_DATA_SIZE 1024 int main(int argc, char *argv[]) { int sockfd, sendBytes,recvBytes; char sendBuf[MAX_DATA_SIZE],recvBuf[MAX_DATA_SIZE]; struct hostent *host; struct sockaddr_in servAddr; if(argc != 2) { fprintf(stderr,"usage:./client [hostname]"); exit(1); } /*translate the address*/ if((host = gethostbyname(argv[1])) == NULL) { perror("fail to get host by name"); exit(1); } printf("Success to get host by name...\n"); /*establish a socket*/ if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { perror("fail to establish a socket"); exit(1); } printf("Success to establish a socket...\n"); /*init sockaddr_in*/ servAddr.sin_family = AF_INET; servAddr.sin_port = htons(SERVPORT); servAddr.sin_addr = *((struct in_addr *)host -> h_addr); bzero(&(servAddr.sin_zero), 8); /*connect the socket*/ if(connect(sockfd, (struct sockaddr *)&servAddr, sizeof(struct sockaddr_in)) == -1) { perror("fail to connect the socket"); exit(1); } printf("Success to connect the socket...\n"); printf("\033[40;32mWelcome to join %s!\033[1m\n", inet_ntoa(servAddr.sin_addr)); //include color set while(1) { /*send datas to server*/ printf("Client:"); gets(sendBuf); if((sendBytes = send(sockfd, sendBuf, strlen(sendBuf), 0)) != strlen(sendBuf)) { perror("fail to send datas"); exit(1); } printf("(Success to send data!)\n"); memset(sendBuf, 0x00, MAX_DATA_SIZE); /*receive datas from server*/ if((recvBytes = recv(sockfd, recvBuf, MAX_DATA_SIZE, 0)) == -1) { perror("fail to receive datas"); exit(1); } printf("Server: %s \n", recvBuf); memset(recvBuf, 0x00, MAX_DATA_SIZE); } close(sockfd); }
/* * Chat on Linux Terminal--alpha * Worte by Jimmy's [email protected] * 2011-2-23 * * This is the sorce code of server * Some BUGS still unsloved, but we are trying our best to debug * Be sure that your system's port "1234" is not busy! * * */ #include<stdio.h> #include<stdlib.h> #include<errno.h> #include<string.h> #include<netdb.h> #include<unistd.h> #include<sys/types.h> #include<sys/socket.h> #include<sys/time.h> #include<sys/un.h> #include<sys/ioctl.h> #include<sys/wait.h> #include<netinet/in.h> #include<arpa/inet.h> #define SERVPORT 1234 #define BACKLOG 20 #define MAX_CON_NO 10 #define MAX_DATA_SIZE 1024 int main(int argc, char *argv[]) { struct sockaddr_in serverSockaddr, clientSockaddr; int sinSize, recvBytes, sendBytes; fd_set readfd; fd_set writefd; int sockfd, clientfd; char sendBuf[MAX_DATA_SIZE], recvBuf[MAX_DATA_SIZE]; if(argc != 1) { printf("usage:./server\n"); exit(1); } /*establish a socket*/ if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { perror("fail to establish a socket"); exit(1); } printf("Success to establish a socket...(sockfd = %d)\n", sockfd); /*init sockaddr_in*/ serverSockaddr.sin_family = AF_INET; serverSockaddr.sin_port = htons(SERVPORT); serverSockaddr.sin_addr.s_addr = htonl(INADDR_ANY); bzero(&(serverSockaddr.sin_zero), 8); int on = 1; setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)); /*bind socket*/ if(bind(sockfd, (struct sockaddr *)&serverSockaddr, sizeof(struct sockaddr))== -1) { perror("fail to bind"); exit(1); } printf("Success to bind the socket...\n"); /*listen on the socket*/ if(listen(sockfd, BACKLOG) == -1) { perror("fail to listen"); exit(1); } printf("Success to listen on the socket...\n"); while(1) { FD_ZERO(&readfd); FD_SET(sockfd, &readfd); sinSize = sizeof(struct sockaddr_in); if(select(MAX_CON_NO, &readfd, NULL, NULL, (struct timeval *)0) > 0) { if(FD_ISSET(sockfd, &readfd) > 0) { /*accept a client's request*/ if((clientfd = accept(sockfd, (struct sockaddr *)&clientSockaddr, &sinSize)) == -1) { perror("fail to accept"); exit(1); } printf("Success to accpet a connection request...\n"); printf("\033[40;32m%s join in!\033[1m\n", inet_ntoa(clientSockaddr.sin_addr));//include color set while(1) { /*receive datas from client*/ if((recvBytes = recv(clientfd, recvBuf, MAX_DATA_SIZE, 0)) == -1) { perror("fail to receive datas"); exit(1); } printf("Client:%s\n", recvBuf); memset(recvBuf, 0x00, MAX_DATA_SIZE); /*send datas to client*/ printf("Server:"); gets(sendBuf); if((sendBytes = send(clientfd, sendBuf, strlen(sendBuf), 0)) != strlen(sendBuf)) { perror("fail to send datas"); exit(1); } printf("(Success to send data!)\n"); memset(sendBuf, 0x00, MAX_DATA_SIZE); } } close(sockfd); } } }
執行方法:
[email protected]:~$ gcc -o client client.c
[email protected]:~$ gcc -o server server.c
[email protected]:~$ ./server
Success to establish a socket...(sockfd = 3)
Success to bind the socket...
Success to listen on the socket...
[email protected]:~$ ./client MyPet Success to get host by name... Success to establish a socket... Success to connect the socket... Welcome to join 127.0.1.1! Client:
相關推薦
最簡單的Linux命令列Socket聊天程式原始碼
只有今天貼出程式碼,明天看才知道自己有多麼傻。 單執行緒,一對一聊天,混搭風格程式設計,函式亂入不解釋…… /* * Chat on Linux Terminal--alpha * Worte by Jimmy's [email protected]
Git時間-最簡單的命令列
最近開始學習使用Git和GitHub,總結一下Windows下的基本使用,配方簡單,食用愉快~ =) 詳細引數可以參考官方文件等教程。 Git 安裝 Windows下使用Git需要配置Cygwin之類的模擬環境。當然工具安裝過程越簡單越好,直接從m
服務計算 - 3 Golang開發Linux命令列實用程式 - selpg
文章目錄 Golang開發Linux命令列實用程式 - selpg 1. 介紹 2. 設計與實現 2.1 設計思路 2.2 功能模組劃分與實現 4 參考文獻
服務計算3 開發 Linux 命令列實用程式
文章目錄 概述 1.解析引數 2.命令列的'<','>','|'符號 3.執行命令列的命令 4.總結 概述 本次作業參考潘老師的部落格 https://pmlpml.github.io/ServiceComput
linux 作業系統下簡單的命令列操作
一: 配置linux 作業系統虛擬主機 首先安裝一個虛擬機器(百度上面有很多哦) , 我主要使用的是VMware workstation 然後 下載一個centos映象6..5到7都可以; 然後用VMware安裝下載好的centos 配置好語言 , 使用者名稱 , 密
在Linux命令列終端中寫python程式碼的簡單操作
Linux終端中的操作均是使用命令列來進行的。因此,對於小白來說,熟記幾個基本的命令列和使用方法能夠較快的在Linux命令列環境中將python用起來。 開啟命令列視窗 開啟命令列視窗的快捷鍵如下: Ctrl + Alt + t 關閉名命令列視窗 關閉命令列視窗的快捷鍵如下:
3 Golang開發Linux命令列實用程式
構建命令列引數的結構體,由於引數使用的比較多,可以使用一個結構體儲存起來,使用起來比較方便 type selpg_args struct { startPage int endPage int inFile string pageLen int
linux和windows中命令列編譯qt程式步驟
注:此方法未經本人證實 1、開啟環境變數設定視窗,編輯 PATH 變數,新增如下內容: c:/Qt/2010.02.1/bin/; c:/Qt/2010.02.1/qt/bin/; c:/Qt/2010.02.1/mingw/bin/ 2、開啟環境變數設定視窗,新增環境變數QTDI
程式設計師最常用linux命令(持續更新版)
作為開發者,公司職務分的不是很明確,開發有時候也得去linux上搞搞版本上線,環境搭建,部署系統之類的,所以下面是個人經歷過,遇到在linux上經常用到什麼命令,記錄下來 進入資料夾命令 cd + 資料夾名字 列出資料夾下面的檔案: ll
linux(一)——命令列建立c程式並編譯
gcc表示翻譯官、翻譯組織一、用命令列建c檔案1、vi 檔名.檔案格式 eg: vi a.c 回車//建立c檔案2.儲存退出(ESC,:wq)寫完內容後,按“ESC”,然後“:”,輸入“wq”儲存退出3、開啟檔案(gedit 檔名.檔案格式)gedit a.c //進入
為想學SQLite或練習SQL語言的朋友搭建簡單的命令列環境------在Windows, Linux, Android(用adb連線安卓手機)上玩轉SQLite資料庫的sqlite3命令列
有言在先: 如果你是隻想玩玩SQL語句的lazy bone, 請直接看本文最後的"LAST部分" 之所以寫這篇文章, 是因為覺得SQLite實在是太棒了, 想學習資料庫的朋友們, 千萬不要錯過這麼優秀的資料庫。 對於初學者來說, SQLite
最簡單的命令行釘釘機器人發群信息
通過命令 -h 官方文檔 color http -type ken ocs 簡單 紅色文字內容替換成自己的token,就可以通過命令行發布自己的釘釘群通知了 curl -H "Content-Type: application/json" -d ‘{"msgtype"
linux命令列學習
awk ~ 匹配符 在pattern部分進行欄位匹配操作。文中包含bin的很多,但要找到以:分割後,第五個匹配bin的使用者名稱,相當於用:將每行分割成陣列,索引5值匹配,則將第一個打印出來 awk -F: '$5 ~ /bin/{print $1}' /etc/passwd awk NR條件語
如何在Linux 命令列終端分屏
下面介紹兩種終端分屏工具:screen和tmux 一、使用screen分屏(只能上下分屏,不能左右分屏) (1)安裝工具 在ubuntu系統中使用sudo apt-get install screen 安裝screen工具 (2)使用工具 1,輸入命令scree
RF工具自定義linux命令列命令執行程式碼及資料庫訪問
之前寫了幾次資料庫連線和linux命令列執行的程式碼,在此儲存下。 另考慮到python2的中文編碼問題,註釋等都用簡單英文,見諒~ import paramiko class Excsshcmd(): ssh = paramiko.SSHClient()
在 Linux 命令列中使用 tcpdump 抓包
tcpdump 是一款靈活、功能強大的抓包工具,能有效地幫助排查網路故障問題。 以我作為管理員的經驗,在網路連線中經常遇到十分難以排查的故障問題。對於這類情況,tcpdump 便能派上用場。 tcpdump 是一個命令列實用工具,允許你抓取和分析經過系統的流量資料包。它通常被用作於網路故障分析工具以及安全
python核心程式設計,使用了twisted.internet類建立一個簡單的半雙工聊天程式
Server部分: '''Created on 2018年5月6日一個時間戳TCP伺服器,他使用了twisted.internet類@author: Administrator'''from twisted.internet import protocol,reactorfrom time imp
Linux命令列使用matplotlib,報錯_tkinter.TclError: no display name and no $DISPLAY environment variable問題解決
問題 我在Linux命令列使用Python的matplotlib,報錯 File "/usr/lib/python3/dist-packages/matplotlib/pyplot.py", line 1466, in title return gca().set_titl
Linux命令列內容
命令列內容: 一般模式 移動游標 【ctrl】+【f】 螢幕【向前】移動一頁 【ctrl】+【b】 螢幕【向後】移動一頁 0 這是數字0:移動到這一行的最前面字元處
mongodb linux 命令列部分命令
shell相關命令 輸入help可以看到基本操作命令: 連線 ./mongo --port 8000 --host 10.130.161.16 第二種連線方式 mongo IP:埠/資料庫名 -u 使用者名稱 -p 密碼 退出 exit