1. 程式人生 > >最簡單的Linux命令列Socket聊天程式原始碼

最簡單的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