前言

本章节是用基本的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编程入门实例(含源码下载)相关推荐

  1. SwiftUI 精品项目之完整MOOC幕课iOS项目 含服务端 轮播欢迎页面(教程含源码)

    实战需求 SwiftUI 精品项目之完整MOOC幕课iOS项目 (教程含源码) 本文价值与收获 看完本文后,您将能够作出下面的界面 看完本文您将掌握的技能 自动轮播 个性化注册界面 个人信息界面 带f ...

  2. 搭建阿里云服务器,实现服务端与客户端socket数据通信(详细版)

    文章目录 0 引言 1. 注册账号.免费申请阿里云服务器 2. 配置服务器环境 3. 远程连接服务器 4. 给服务器传输文件 5. 可能出现的问题 0 引言 最近在做一个项目,需要用到一个客户端(电脑 ...

  3. Linux自带的五子棋游戏,Android 五子棋游戏示例图与源码下载

    Android 五子棋游戏源码很多,下面是一款不错的Android五子棋游戏示例图及源码,导入Eclipse工程就可以使用了. Android 五子棋游戏部分源码: package five.itca ...

  4. java服务端代码_Java Socket编程服务器响应客户端实例代码

    通过输入流来读取客户端信息,相应的时候通过输出流来实现. 服务端类的代码: import java.io.BufferedReader; import java.io.IOException; imp ...

  5. ntp服务器linux(服务端和客户端)配置

    1.介绍ntp服务 NTP属于运用层协议(依据UDP传输,运用的端口号为123),用来同步网络中分布式时间服务器和客户端之间的时间,使网络中的设备供应依据一起时间的运用成为可能. 时间服务器和客户端是 ...

  6. JAVA实现ftp服务端_用 java 实现FTP SERVER(附源码)

    前面用 PYTHON 实现了一个 ftp server(参考这里) ,有朋友问有没有java版本的,其实说白了,ftp 也就是 tcp/ip 协议的一个应用而已,而tcp/ip 基本都是通过socke ...

  7. Scratch少儿编程教培系统源码下载

    2021年,随着信息技术的迅猛发展,随着AI智能的普及,国家也越来越重视并大力推广编程,许多学校还开设了少儿编程的启蒙课和体验课,所以前景非常好.只是目前投入过大,所以这里我们可以通过获取源码的方式自 ...

  8. 【资源】年底送你一套编程视频(含源码)

    很多程序员喜欢调侃说自己是"码农": 编码的农民工, 在工作上被各种使唤, 各种加班,累得像个牲口. 在职业发展上各种迷茫和彷徨, 完全看不到未来的希望, 但是"大数据时 ...

  9. 搜索引擎优化高级编程(php版),搜索引擎优化高级编程PHP版(含源码)

    搜索引擎优化在传统意义上是营销团队的工作.但在本书里,我们将从另外一个角度看待搜索引擎优化,让编程人员也参与到搜索引擎优化的队伍中来. 搜索引擎优化(SEO)不只是营销部门的工作.它必须经过Web站点 ...

最新文章

  1. python打包exe 之打包sklearn模型中的各种坑及其解决方法。
  2. 10.16 ln软硬链接的创建等
  3. 如何检测ARP病毒,arp病毒怎么解决?
  4. datagrip中sqlite3导入csv数据集
  5. Codeforces Round #705 (Div. 2) D. GCD of an Array 质因子分解 + stl维护
  6. 工作304:uni返回上一页面
  7. python 连接oracle_常用的Python库,给大家分享一下!
  8. TFS中的工作项(六)
  9. 【Spark】Spark-空RDD判断与处理
  10. linux内核实现ipsec,基于IPv6的IPSec原理分析和在Linux内核中的实现
  11. Matlab RRT算法三维轨迹规划及贪心算法轨迹优化
  12. 基于决策树模型对 IRIS 数据集分类
  13. Linux中断(interrupt)子系统之三:中断流控处理层(转)
  14. Google Chrome开发者工具-移动仿真:网络带宽控制
  15. xposed框架 微信群发源码
  16. 让微信二维码扫描你的APK
  17. 11-20什么是内网,外网,局域网,如何判断
  18. Linux系统配置网卡ip地址
  19. 【机器学习】聚类算法DBSCAN、K-means、Mean Shift对比分析及具体代码实现
  20. c++简易病毒(附代码)

热门文章

  1. 2013应届毕业生“东方通”校招应聘总结
  2. 淘宝TFS文件系统配置
  3. Gridview模板中提供的删除功能
  4. Eclipse Tips(2):代码颜色设置
  5. linux命名管道进程间通信,《Linux 进程间通信》命名管道:FIFO
  6. python3正则表达式判断ipv4_Python 正则表达式验证IPv4地址
  7. android天气预报----google开源天气API,SAX解析
  8. yii2框架中整合PHPOffice的PhpSpreadsheet开源库
  9. 26期20180615磁盘格式化挂载以及手动增加swap空间
  10. 使用expect编写脚本