Linux/Unix服务端和客户端Socket编程入门实例(含源码下载)
前言
本章节是用基本的Linux/Unix基本函数编写一个完整的服务器和客户端例子,可在Linux(ubuntu)和Unix(freebsd)上运行,客户端和服务端的功能如下:
客户端从标准输入读入一行,发送到服务端
服务端从网络读取一行,然后输出到客户端
客户端收到服务端的响应,输出这一行到标准输出
服务端
代码如下:
#include <unistd.h>#include <sys/types.h> /* basic system data types */#include <sys/socket.h> /* basic socket definitions */#include <netinet/in.h> /* sockaddr_in{} and other Internet defns */#include <arpa/inet.h> /* inet(3) functions */ #include <stdlib.h>#include <errno.h>#include <stdio.h>#include <string.h> #define MAXLINE 1024//typedef struct sockaddr SA;void handle(int connfd); int main(int argc, char **argv){int listenfd, connfd;int serverPort = 6888;int listenq = 1024; pid_t childpid;char buf[MAXLINE]; socklen_t socklen; struct sockaddr_in cliaddr, servaddr; socklen = sizeof(cliaddr); bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = htonl(INADDR_ANY); servaddr.sin_port = htons(serverPort); listenfd = socket(AF_INET, SOCK_STREAM, 0);if (listenfd < 0) { perror("socket error");return -1; }if (bind(listenfd, (struct sockaddr *) &servaddr, socklen) < 0) { perror("bind error");return -1; }if (listen(listenfd, listenq) < 0) { perror("listen error"); return -1; } printf("echo server startup,listen on port:%d\n", serverPort);for ( ; ; ) { connfd = accept(listenfd, (struct sockaddr *)&cliaddr, &socklen);if (connfd < 0) { perror("accept error");continue; } sprintf(buf, "accept form %s:%d\n", inet_ntoa(cliaddr.sin_addr), cliaddr.sin_port); printf(buf,""); childpid = fork();if (childpid == 0) { /* child process */ close(listenfd); /* close listening socket */ handle(connfd); /* process the request */ exit (0); } else if (childpid > 0) { close(connfd); /* parent closes connected socket */ } else { perror("fork error"); } }} void handle(int connfd){ size_t n;char buf[MAXLINE]; for(;;) { n = read(connfd, buf, MAXLINE);if (n < 0) {if(errno != EINTR) { perror("read error");break; } }if (n == 0) {//connfd is closed by client close(connfd); printf("client exit\n");break; }//client exit if (strncmp("exit", buf, 4) == 0) { close(connfd); printf("client exit\n");break; } write(connfd, buf, n); //write maybe fail,here don't process failed error } }
客户端
代码如下:
#include <unistd.h>#include <sys/types.h> /* basic system data types */#include <sys/socket.h> /* basic socket definitions */#include <netinet/in.h> /* sockaddr_in{} and other Internet defns */#include <arpa/inet.h> /* inet(3) functions */#include <netdb.h> /*gethostbyname function */ #include <stdlib.h>#include <errno.h>#include <stdio.h>#include <string.h> #define MAXLINE 1024 void handle(int connfd); int main(int argc, char **argv){char * servInetAddr = "127.0.0.1";int servPort = 6888;char buf[MAXLINE];int connfd;struct sockaddr_in servaddr; if (argc == 2) { servInetAddr = argv[1]; }if (argc == 3) { servInetAddr = argv[1]; servPort = atoi(argv[2]); }if (argc > 3) { printf("usage: echoclient <IPaddress> <Port>\n");return -1; } connfd = socket(AF_INET, SOCK_STREAM, 0); bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(servPort); inet_pton(AF_INET, servInetAddr, &servaddr.sin_addr); if (connect(connfd, (struct sockaddr *) &servaddr, sizeof(servaddr)) < 0) { perror("connect error");return -1; } printf("welcome to echoclient\n"); handle(connfd); /* do it all */ close(connfd); printf("exit\n"); exit(0);} void handle(int sockfd){char sendline[MAXLINE], recvline[MAXLINE];int n;for (;;) {if (fgets(sendline, MAXLINE, stdin) == NULL) {break;//read eof }/* //也可以不用标准库的缓冲流,直接使用系统函数无缓存操作 if (read(STDIN_FILENO, sendline, MAXLINE) == 0) { break;//read eof }*/ n = write(sockfd, sendline, strlen(sendline)); n = read(sockfd, recvline, MAXLINE);if (n == 0) { printf("echoclient: server terminated prematurely\n");break; } write(STDOUT_FILENO, recvline, n);//如果用标准库的缓存流输出有时会出现问题//fputs(recvline, stdout); }}
下载和编译
下载地址
编译和启动服务器:
gcc echoserver.c -o echoserver./echoserver
编译和启动客户端
gcc echoclient.c -o echoclient./echoclient
转载于:https://www.cnblogs.com/ggjucheng/archive/2012/01/17/2324584.html
Linux/Unix服务端和客户端Socket编程入门实例(含源码下载)相关推荐
- SwiftUI 精品项目之完整MOOC幕课iOS项目 含服务端 轮播欢迎页面(教程含源码)
实战需求 SwiftUI 精品项目之完整MOOC幕课iOS项目 (教程含源码) 本文价值与收获 看完本文后,您将能够作出下面的界面 看完本文您将掌握的技能 自动轮播 个性化注册界面 个人信息界面 带f ...
- 搭建阿里云服务器,实现服务端与客户端socket数据通信(详细版)
文章目录 0 引言 1. 注册账号.免费申请阿里云服务器 2. 配置服务器环境 3. 远程连接服务器 4. 给服务器传输文件 5. 可能出现的问题 0 引言 最近在做一个项目,需要用到一个客户端(电脑 ...
- Linux自带的五子棋游戏,Android 五子棋游戏示例图与源码下载
Android 五子棋游戏源码很多,下面是一款不错的Android五子棋游戏示例图及源码,导入Eclipse工程就可以使用了. Android 五子棋游戏部分源码: package five.itca ...
- java服务端代码_Java Socket编程服务器响应客户端实例代码
通过输入流来读取客户端信息,相应的时候通过输出流来实现. 服务端类的代码: import java.io.BufferedReader; import java.io.IOException; imp ...
- ntp服务器linux(服务端和客户端)配置
1.介绍ntp服务 NTP属于运用层协议(依据UDP传输,运用的端口号为123),用来同步网络中分布式时间服务器和客户端之间的时间,使网络中的设备供应依据一起时间的运用成为可能. 时间服务器和客户端是 ...
- JAVA实现ftp服务端_用 java 实现FTP SERVER(附源码)
前面用 PYTHON 实现了一个 ftp server(参考这里) ,有朋友问有没有java版本的,其实说白了,ftp 也就是 tcp/ip 协议的一个应用而已,而tcp/ip 基本都是通过socke ...
- Scratch少儿编程教培系统源码下载
2021年,随着信息技术的迅猛发展,随着AI智能的普及,国家也越来越重视并大力推广编程,许多学校还开设了少儿编程的启蒙课和体验课,所以前景非常好.只是目前投入过大,所以这里我们可以通过获取源码的方式自 ...
- 【资源】年底送你一套编程视频(含源码)
很多程序员喜欢调侃说自己是"码农": 编码的农民工, 在工作上被各种使唤, 各种加班,累得像个牲口. 在职业发展上各种迷茫和彷徨, 完全看不到未来的希望, 但是"大数据时 ...
- 搜索引擎优化高级编程(php版),搜索引擎优化高级编程PHP版(含源码)
搜索引擎优化在传统意义上是营销团队的工作.但在本书里,我们将从另外一个角度看待搜索引擎优化,让编程人员也参与到搜索引擎优化的队伍中来. 搜索引擎优化(SEO)不只是营销部门的工作.它必须经过Web站点 ...
最新文章
- python打包exe 之打包sklearn模型中的各种坑及其解决方法。
- 10.16 ln软硬链接的创建等
- 如何检测ARP病毒,arp病毒怎么解决?
- datagrip中sqlite3导入csv数据集
- Codeforces Round #705 (Div. 2) D. GCD of an Array 质因子分解 + stl维护
- 工作304:uni返回上一页面
- python 连接oracle_常用的Python库,给大家分享一下!
- TFS中的工作项(六)
- 【Spark】Spark-空RDD判断与处理
- linux内核实现ipsec,基于IPv6的IPSec原理分析和在Linux内核中的实现
- Matlab RRT算法三维轨迹规划及贪心算法轨迹优化
- 基于决策树模型对 IRIS 数据集分类
- Linux中断(interrupt)子系统之三:中断流控处理层(转)
- Google Chrome开发者工具-移动仿真:网络带宽控制
- xposed框架 微信群发源码
- 让微信二维码扫描你的APK
- 11-20什么是内网,外网,局域网,如何判断
- Linux系统配置网卡ip地址
- 【机器学习】聚类算法DBSCAN、K-means、Mean Shift对比分析及具体代码实现
- c++简易病毒(附代码)
热门文章
- 2013应届毕业生“东方通”校招应聘总结
- 淘宝TFS文件系统配置
- Gridview模板中提供的删除功能
- Eclipse Tips(2):代码颜色设置
- linux命名管道进程间通信,《Linux 进程间通信》命名管道:FIFO
- python3正则表达式判断ipv4_Python 正则表达式验证IPv4地址
- android天气预报----google开源天气API,SAX解析
- yii2框架中整合PHPOffice的PhpSpreadsheet开源库
- 26期20180615磁盘格式化挂载以及手动增加swap空间
- 使用expect编写脚本