日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國內(nèi)最全I(xiàn)T社區(qū)平臺(tái) 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當(dāng)前位置:首頁 > php開源 > php教程 > Socket 編程實(shí)踐(5) --p2p聊天程序設(shè)計(jì)與實(shí)現(xiàn)

Socket 編程實(shí)踐(5) --p2p聊天程序設(shè)計(jì)與實(shí)現(xiàn)

來源:程序員人生   發(fā)布時(shí)間:2015-01-02 09:56:17 閱讀次數(shù):3271次

1個(gè)短連接的client

//短鏈接客戶端 int main() { int loopCount = 20; char sendBuf[BUFSIZ] = {0}; char recvBuf[BUFSIZ] = {0}; for (int i = 0; i < loopCount; ++i) { sprintf(sendBuf,"Hello Server %d ",i); //創(chuàng)建新的套接字 int sockfd = socket(AF_INET,SOCK_STREAM,0); if (sockfd == ⑴) { err_exit("socket error"); } //填寫好服務(wù)器地址及其端口號(hào) struct sockaddr_in serverAddr; serverAddr.sin_family = AF_INET; serverAddr.sin_port = htons(8002); //本機(jī)測(cè)試,填寫127.0.0.1(回環(huán)地址) serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); //連接server if (connect(sockfd,(struct sockaddr *)&serverAddr,sizeof(serverAddr)) == ⑴) { err_exit("connect error"); } //向server發(fā)送數(shù)據(jù) if (write(sockfd,sendBuf,strlen(sendBuf)) == ⑴) { err_exit("write socket error"); } int readCount = 0; //從server接收數(shù)據(jù) if ((readCount = read(sockfd,recvBuf,sizeof(recvBuf))) < 0) { err_exit("read socket error"); } //將其回寫到終端 write(STDOUT_FILENO,recvBuf,strlen(recvBuf)); close(sockfd); } return 0; }


注:server端基于上1篇博客中的代碼


點(diǎn)對(duì)點(diǎn)聊天程序設(shè)計(jì)與實(shí)現(xiàn)

點(diǎn)對(duì)點(diǎn)聊天程序功能說明:

 

 

代碼實(shí)現(xiàn)與說明

//serever端完全代碼與說明 #include "commen.h" int main() { //安裝信號(hào)接收函數(shù) signal(SIGUSR1,onSignal); //創(chuàng)建監(jiān)聽套接字 int sockfd = socket(AF_INET,SOCK_STREAM,0); if (sockfd == ⑴) { err_exit("socket error"); } //添加地址復(fù)用 int optval = 1; if (setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&optval,sizeof(optval)) == ⑴) { err_exit("setsockopt SO_REUSEADDR error"); } //將監(jiān)聽套接字綁定本機(jī) struct sockaddr_in serverAddr; serverAddr.sin_family = AF_INET; //該行可以刪除 serverAddr.sin_port = htons(8001); serverAddr.sin_addr.s_addr = INADDR_ANY; //綁定本機(jī)的任意1個(gè)IP地址 if (bind(sockfd,(struct sockaddr *)&serverAddr,sizeof(serverAddr)) == ⑴) { err_exit("bind error"); } //啟用監(jiān)聽套接字 //1旦調(diào)用了listen,則sockfd編程被動(dòng)套接字 -> 等待客戶真?zhèn)€連接(只能接受連接,不能發(fā)送連接) if (listen(sockfd,SOMAXCONN) == ⑴) { err_exit("listen error"); } //如果沒有客戶端鏈接的來到,則該系統(tǒng)調(diào)用會(huì)1直阻塞 struct sockaddr_in peerAddr; socklen_t peerLen = sizeof(peerAddr); int peerSockfd = accept(sockfd, (struct sockaddr *)&peerAddr,&peerLen); if (peerSockfd == ⑴) { err_exit("accept error"); } //客戶端來到 cout << "Client Connected:" << endl; cout << " peerAddr.sin_addr: " << inet_ntoa(peerAddr.sin_addr) << endl; cout << " peerAddr.sin_port: " << ntohs(peerAddr.sin_port) << endl; //創(chuàng)建子進(jìn)程 pid_t pid = fork(); if (pid == ⑴) { err_exit("fork error"); } //父進(jìn)程:從客戶端接收數(shù)據(jù) -> 打印到屏幕 if (pid > 0) { close(STDIN_FILENO); //關(guān)閉沒用的文件描寫符 char recvBuf[BUFSIZ] = {0}; int readCount = 0; //從客戶端接收數(shù)據(jù) while ((readCount = read(peerSockfd,recvBuf,sizeof(recvBuf))) > 0) { recvBuf[readCount] = 0; //將其打印到屏幕 fprintf(stdout,"%s",recvBuf); memset(recvBuf,0,sizeof(recvBuf)); } //對(duì)端已關(guān)閉 if (readCount == 0) { close(peerSockfd); //關(guān)閉通訊結(jié)點(diǎn) cout << "peer connect closed" << endl; //發(fā)送SIGUSR1信號(hào)給子進(jìn)程,將子進(jìn)程殺死 kill(pid,SIGUSR1); _exit(0); } //接收毛病 else if (readCount == ⑴) { close(peerSockfd); //發(fā)送SIGUSR1信號(hào)給子進(jìn)程,將子進(jìn)程殺死 kill(pid,SIGUSR1); err_exit("read error"); } } else if (pid == 0) //子進(jìn)程:從鍵盤接收數(shù)據(jù) -> 寫到客戶端 { close(STDOUT_FILENO); char sendBuf[BUFSIZ] = {0}; //從鍵盤接收數(shù)據(jù) while (true) { if (fgets(sendBuf,sizeof(sendBuf),stdin) == NULL) { break; } else if (strncmp(sendBuf,"quit",4) == 0) { close(peerSockfd); kill(getppid(),SIGUSR2); break; } //發(fā)送到client端 if (write(peerSockfd,sendBuf,strlen(sendBuf)) == ssize_t(⑴)) { close(peerSockfd); err_exit("write socket error"); } memset(sendBuf,0,sizeof(sendBuf)); } } close(sockfd); return 0; }

//client端完全代碼與說明 #include "commen.h" int main() { signal(SIGUSR1,onSignal); //創(chuàng)建新的套接字 int sockfd = socket(AF_INET,SOCK_STREAM,0); if (sockfd == ⑴) { err_exit("socket error"); } //填寫server端IP地址及其端口號(hào) struct sockaddr_in serverAddr; serverAddr.sin_family = AF_INET; serverAddr.sin_port = htons(8001); serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); //連接到server if (connect(sockfd,(struct sockaddr *)&serverAddr,sizeof(serverAddr)) == ⑴) { err_exit("connect error"); } pid_t pid = fork(); if (pid == ⑴) { err_exit("fork error"); } //父進(jìn)程:從鍵盤接收數(shù)據(jù) -> 將之發(fā)送給server端 if (pid > 0) { close(STDOUT_FILENO); char sendBuf[BUFSIZ] = {0}; //從鍵盤接收數(shù)據(jù) while (true) { if (fgets(sendBuf,sizeof(sendBuf),stdin) == NULL) { break; } else if (strncmp(sendBuf,"quit",4) == 0) { close(sockfd); //發(fā)送SIGUSR1信號(hào)給子進(jìn)程,將其關(guān)閉 kill(pid,SIGUSR1); _exit(0); } //發(fā)送到server端 if (write(sockfd,sendBuf,strlen(sendBuf)) == ssize_t(⑴)) { close(sockfd); err_exit("write socket error"); } memset(sendBuf,0,sizeof(sendBuf)); } } else if (pid == 0) //子進(jìn)程:從server端接收數(shù)據(jù),將其打印到屏幕 { close(STDIN_FILENO); char recvBuf[BUFSIZ] = {0}; int readCount = 0; //從server端接收數(shù)據(jù) while ((readCount = read(sockfd,recvBuf,sizeof(recvBuf))) > 0) { recvBuf[readCount] = 0; //將其打印到屏幕 fprintf(stdout,"%s",recvBuf); memset(recvBuf,0,sizeof(recvBuf)); } if (readCount == 0) { close(sockfd); cout << "peer connect closed" << endl; //發(fā)送SIGUSR2信號(hào)給父進(jìn)程,將其關(guān)閉 kill(getppid(),SIGUSR2); _exit(0); } else if (readCount == ⑴) { close(sockfd); err_exit("read error"); } } return 0; }


可以看出,此時(shí)既沒有端口占用,也沒有僵尸進(jìn)程!



-commen.h

#ifndef COMMEN_H_INCLUDED #define COMMEN_H_INCLUDED #include <unistd.h> #include <signal.h> #include <errno.h> #include <fcntl.h> #include <sys/types.h> #include <sys/wait.h> #include <sys/stat.h> #include <sys/ipc.h> #include <sys/shm.h> #include <sys/msg.h> #include <sys/sem.h> #include <sys/socket.h> #include <arpa/inet.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <string.h> #include <stdio.h> #include <stdlib.h> #include <iostream> using namespace std; void err_exit(std::string str) { perror(str.c_str()); exit(EXIT_FAILURE); } struct SendStruct { int type; char text[BUFSIZ]; }; void onSignal(int signalNumber) { switch (signalNumber) { case SIGUSR1: cout << "child receive SIGUSR1" << signalNumber << endl; _exit(0); case SIGUSR2: cout << "parent receive SIGUSR2: " << signalNumber << endl; _exit(0); default: cout << "RECV OTHRER SIGNAL" << endl; } } #endif // COMMEN_H_INCLUDED

附-Makefile

CC = g++ CPPFLAGS = -Wall -g -pthread BIN = server client SOURCES = $(BIN.=.cpp) .PHONY: clean all all: $(BIN) $(BIN): $(SOURCES) clean: -rm -rf $(BIN) bin/ obj/ core

生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對(duì)您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 国产亚洲欧美视频 | 久久91精品国产91久久跳 | 一区二区视频 | 中文字幕日韩一区二区三区不卡 | 日韩精品www | 亚洲淫视频 | 日韩一区二区三区在线 | 欧美成人精品一区二区三区在线看 | 黄色成人在线观看 | 日日操夜夜操天天操 | 精品久久久久久综合日本 | 精品在线一区二区 | 91高清免费看 | 亚洲最大成人在线 | 日韩不卡一区二区三区 | 亚洲成人av一区 | 国产精品无码久久久久 | 国产视频久久久 | 中文字幕国产在线 | 在线免费看黄网站 | 精品国产区 | 亚洲二区在线观看 | 免费嗨片网| 亚洲视频1区 | 夜夜穞天天穞狠狠穞 | 久久在线精品 | 中文字幕不卡在线观看 | 久久免费中文视频 | 日本精品久久久 | 成人在线一区二区三区 | 99精品在线观看 | 做a视频在线观看 | 黄色av三级| 日韩精品视频中文字幕 | 成人a网 | 91网站免费在线观看 | 视频一区二区三区在线观看 | 日韩精品一区在线观看 | 亚洲视频大全 | 日韩成人片| 亚洲综合一区二区 |