linux下用C语言实现TCP/IP服务器与客户端互相发送数据的socket编程

server.c

#include <sys/stat.h>#include <fcntl.h>#include <errno.h>#include <netdb.h>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <stdio.h>#include <string.h>#include <stdlib.h>#include <unistd.h>#define SERVER_PORT 6666/*
监听后,一直处于accept阻塞状态,
直到有客户端连接,
当客户端如数quit后,断开与客户端的连接
*/int main(){//调用socket函数返回的文件描述符int serverSocket;//声明两个套接字sockaddr_in结构体变量,分别表示客户端和服务器struct sockaddr_in server_addr;struct sockaddr_in clientAddr;int addr_len = sizeof(clientAddr);int client;char buffer[200];int iDataNum;//socket函数,失败返回-1//int socket(int domain, int type, int protocol);//第一个参数表示使用的地址类型,一般都是ipv4,AF_INET//第二个参数表示套接字类型:tcp:面向连接的稳定数据传输SOCK_STREAM//第三个参数设置为0if((serverSocket = socket(AF_INET, SOCK_STREAM, 0)) < 0){perror("socket");return 1;}bzero(&server_addr, sizeof(server_addr));//初始化服务器端的套接字,并用htons和htonl将端口和地址转成网络字节序server_addr.sin_family = AF_INET;server_addr.sin_port = htons(SERVER_PORT);//ip可是是本服务器的ip,也可以用宏INADDR_ANY代替,代表0.0.0.0,表明所有地址server_addr.sin_addr.s_addr = htonl(INADDR_ANY);//对于bind,accept之类的函数,里面套接字参数都是需要强制转换成(struct sockaddr *)//bind三个参数:服务器端的套接字的文件描述符,if(bind(serverSocket, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0){perror("connect");return 1;}//设置服务器上的socket为监听状态if(listen(serverSocket, 5) < 0){perror("listen");return 1;}while(1){printf("监听端口: %d\n", SERVER_PORT);//调用accept函数后,会进入阻塞状态//accept返回一个套接字的文件描述符,这样服务器端便有两个套接字的文件描述符,//serverSocket和client。//serverSocket仍然继续在监听状态,client则负责接收和发送数据//clientAddr是一个传出参数,accept返回时,传出客户端的地址和端口号//addr_len是一个传入-传出参数,传入的是调用者提供的缓冲区的clientAddr的长度,以避免缓冲区溢出。//传出的是客户端地址结构体的实际长度。//出错返回-1client = accept(serverSocket, (struct sockaddr*)&clientAddr, (socklen_t*)&addr_len);if(client < 0){perror("accept");continue;}printf("等待消息...\n");//inet_ntoa ip地址转换函数,将网络字节序IP转换为点分十进制IP//表达式:char *inet_ntoa (struct in_addr);printf("IP is %s\n", inet_ntoa(clientAddr.sin_addr));printf("Port is %d\n", htons(clientAddr.sin_port));while(1){printf("读取消息:");buffer[0] = '\0';iDataNum = recv(client, buffer, 1024, 0);if(iDataNum < 0){perror("recv null");continue;}buffer[iDataNum] = '\0';if(strcmp(buffer, "quit") == 0)break;printf("%s\n", buffer);printf("发送消息:");scanf("%s", buffer);printf("\n");send(client, buffer, strlen(buffer), 0);if(strcmp(buffer, "quit") == 0)break;}}close(serverSocket);return 0;}

client.c

#include <sys/stat.h>#include <fcntl.h>#include <errno.h>#include <netdb.h>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <stdio.h>#include <string.h>#include <stdlib.h>#include <unistd.h>#define SERVER_PORT 6666/*
连接到服务器后,会不停循环,等待输入,
输入quit后,断开与服务器的连接
*/int main(){//客户端只需要一个套接字文件描述符,用于和服务器通信int clientSocket;//描述服务器的socketstruct sockaddr_in serverAddr;char sendbuf[200];char recvbuf[200];int iDataNum;if((clientSocket = socket(AF_INET, SOCK_STREAM, 0)) < 0){perror("socket");return 1;}serverAddr.sin_family = AF_INET;serverAddr.sin_port = htons(SERVER_PORT);//指定服务器端的ip,本地测试:127.0.0.1//inet_addr()函数,将点分十进制IP转换成网络字节序IPserverAddr.sin_addr.s_addr = inet_addr("127.0.0.1");if(connect(clientSocket, (struct sockaddr *)&serverAddr, sizeof(serverAddr)) < 0){perror("connect");return 1;}printf("连接到主机...\n");while(1){printf("发送消息:");scanf("%s", sendbuf);printf("\n");send(clientSocket, sendbuf, strlen(sendbuf), 0);if(strcmp(sendbuf, "quit") == 0)break;printf("读取消息:");recvbuf[0] = '\0';iDataNum = recv(clientSocket, recvbuf, 200, 0);recvbuf[iDataNum] = '\0';printf("%s\n", recvbuf);}close(clientSocket);return 0;}

linux下用C语言实现TCP/IP服务器与客户端互相发送数据的socket编程相关推荐

  1. go语言实现tcp并发服务器与客户端

    go语言实现tcp并发服务器端与客户端 server.go // nc 连接, 发送字母, 加收到转大写的字母 // 如果发送exit ,则会断开连接 package mainimport (&quo ...

  2. python 实战之模仿开发QQ聊天软件(三)TCP/IP服务器与客户端建设

    无论是p2p还是c/s还是b/s,只要用到通讯,必然是要用到今天写的这个. python+MYSQL 在pycharm中的使用 TCP/IP是网络软件最核心的部分,缺少这个你只能当做单机游戏玩. TC ...

  3. QT 之 TCP/IP 服务器和客户端(一)

    TCP协议的程序使用的是客户端/服务器模式,在Qt中提供了QTcpSocket类来编写客户端程序,使用QTcpServer类编写服务器端程序.我们在服务器端进行端口的监听,一旦发现客户端的连接请求,就 ...

  4. C语言N台服务器通信,使用socket的Linux上的C语言文件传输顺序服务器和客户端示例程序 ....

    #include */ #define HELLO_WORLD_SERVER_PORT    6666 #define BUFFER_SIZE 1024 #define FILE_NAME_MAX_S ...

  5. Qt网络程序:基于TCP的服务器、客户端实例

    首先我们需要设置服务器:  项目文件中加入:QT += network  相关头文件: #include<QTcpServer>//监听套接字 #include<QTcpSocket ...

  6. Mysql —— linux下使用c语言访问mySql数据库

    示例1: #include<stdio.h> #include<mysql.h> int main() { MYSQL mysql; mysql_init(&mysql ...

  7. linux下的C语言开发

    在很多人的眼里,C语言和linux常常是分不开的.这其中的原因很多,其中最重要的一部分我认为是linux本身就是C语言的杰出作品.当然,linux操作系统本身对C语言的支持也是相当到位的.作为一个真正 ...

  8. 单片机tcp ip协议c语言,单片机TCP IP协议栈实现的原理

    对已TCP IP协议栈,我们已经说了很多关于它的原理相关的知识了.但是只有原理是不够的,在这方面我们将要举出一个实际操作实例为大家讲解,那么首先我们来看一下有关于单片机TCP/IP就是在单片机上运行的 ...

  9. linux配置指定ip访问指定端口号,操作系统linux和dos linux下通过iptables只允许指定ip地址访问指定端...

    一篇 : linux下通过iptables只允许指定ip地址访问指定端口的设置方法 首先,清除所有预设置 iptables -F#清除预设表filter中的所有规则链的规则 iptables -X#清 ...

最新文章

  1. 台达asda-b2伺服驱动器说明书_REXROTH力士乐DKC系列伺服放大器LED灯都
  2. android学习笔记之ImageView的scaleType属性
  3. strcpy_s与strcpy对照
  4. 数据库设计范式实例解析
  5. TensorBoard(二)
  6. 基于 Android NDK 的学习之旅-----序言
  7. 结构方程模型_结构方程模型(Structural Equation Model, SEM) 三下
  8. c语言寻找文件指令,c语言实现文件查找
  9. sdr 软件_购买软件定义无线电(SDR)还是传统无线电台?|追求欲望无止境
  10. 幼儿园数学目标_幼儿园数学区目标
  11. html5教程_最好HTML和HTML5教程
  12. 从发声机理到听觉感知认识声音的本质
  13. Java源文件的编译运行
  14. 最快零基础上手——latex文档标题、一级标题、二级标题、内容搭建
  15. java 首字母小写_Java中属性名首字母大小写问题
  16. PS:高清晰度的源文件保存成图片如何使图片大小最小
  17. 视频照片合成软件哪个好?快速把手机照片做成视频,简单操作,效果精美!
  18. excel与云mysql连接数据库_小程序读取excel表格数据,并存储到云数据库
  19. GLES2.0中文API-glUniform
  20. 【转载】知识普及:天煞的HTML5到底是个什么东西

热门文章

  1. Java 面向对象编程、jQuery、JavaScript、servlet、javabean----理论知识
  2. IE不能為讀(written)問題解決(轉載)
  3. 插入排序之——直接插入排序(c/c++)
  4. Mybatis和Spring整合
  5. 二进制安装Mariadb
  6. 四川阆中上演“万人同品腊八粥”
  7. spring Cache /Redis 缓存 + Spring 的集成示例
  8. 处方上电脑 北大口腔医嘱一清二楚
  9. 云计算如何对传统软件交付方式产生影响
  10. 【打CF,学算法——二星级】Codeforces Round #313 (Div. 2) B. Gerald is into Art(水题)...